Тут недавно на глаза попался код (немного упрощен ) :
import sys
import sqlite3
# Обертка для базы данных
class Database:
# Класс-обертка для соединения,
# чтобы использовать с with
class dbConnection:
def __init__(self, dbfile):
self.dbfile = dbfile
def __enter__(self):
self.connection = sqlite3.connect(self.dbfile)
self.connection.row_factory = sqlite3.Row
return self.connection
def __exit__(self, type, value, traceback):
if traceback is None:
self.connection.commit()
self.connection.close()
else:
self.connection.rollback()
self.connection.close()
self.connection = None
def __init__(self, dbfile='./users.db'):
# Создание таблицы при первом запуске
newdb = 1 if not os.path.isfile(dbfile) else 0
if newdb:
try:
with self.dbConnection(dbfile) as connection:
connection.execute("""CREATE TABLE users (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
jid TEXT UNIQUE NOT NULL,
token TEXT NOT NULL,
shard TEXT NOT NULL
)""")
except:
raise DatabaseError
self.dbfile = dbfile
def user(self, jid):
try:
with self.dbConnection(self.dbfile) as connection:
res = connection.execute('SELECT * FROM `users` WHERE `jid`=?',
(jid,)).fetchone()
return res
except:
raise DatabaseError
def updateUser(self, jid, token="", shard=""):
try:
with self.dbConnection(self.dbfile) as connection:
connection.execute("""REPLACE INTO users
(jid, token, shard)
VALUES
(?, ?, ?)""",
(jid, token, shard))
except:
raise DatabaseError
def delUser(self, jid):
try:
with self.dbConnection(self.dbfile) as connection:
connection.execute("DELETE FROM `users` WHERE `jid` = ?",
(jid,))
except:
raise DatabaseError
langpack = {
' dbError ': "error DB"
}
storage = Database()
# Классы для исключений:
# raise BasicError - стандартное значение,
# raise BasicError('Error!') - заданное.
class BasicError(Exception):
default = ''
def __init__(self, value=None):
self.value = self.default if not value else value
def __str__(self):
return self.value
class DatabaseError(BasicError):
default = Database.langpack['dbError']
Для чего возбуждать однотипные пользовательские исключение в этом примере, а главное зачем использовать try … except в блоках исключение в которых ведут к необратимому аварийному завершению программы? (если не брать в расчет необходимость вывода своего сообщения об ошибке)
Поясню :
Вот пример где try … except просто необходим
while 1:
try:
x = int(raw_input("Введите число ")) #Здесь может возникнуть исключение
break #Если всё правильно, то выходим из бесконечного while
except ValueError: #А вот здесь обрабатывается исключение неверного формата числа
print ''Ой-ой. Неправильное число. Попробуйте снова..."
try:
with self.dbConnection(dbfile) as connection:
connection.execute("""CREATE TABLE users (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
jid TEXT UNIQUE NOT NULL,
token TEXT NOT NULL,
shard TEXT NOT NULL
)""")
except:
raise DatabaseError
Может я что-то упускаю?
Кто что думает по поводу использования try … except , поделитесь соображениями.
P.S. прошу прощение за возможные орфогафические ошибки
Линк в тему (хоть он и о С++)