Форум сайта python.su
Доброго времени суток!
И так задача:
Есть класс. В классе несколько методов. Методы могут возвращать несколько видов ошибок, как то: невозможность чтения/записи на диск невозможность найти объект, невозможность получить данные объекта, системные ошибки и так далее и так далее.
Соответственно нужно сделать исключения для ошибок.
Сейчас на все ошибки у меня один класс с кодом ошибки и доп. сведениями. Ловится это исключение и потом уже принимаются решения в зависимости от кода ошибки.
На сколько это правильно? то есть не стоит ли сделать на каждую ситуацию свое исключение с одним базовым классом?
И какие плюсы/минусы подходов?
Или же тут нет разницы, а только собственное предпочтение?
Офлайн
Ключевой вопрос тут: как эти исключения будут обрабатываться. Если единообразно - то все ложить в один класс.
try:
do()
except Error, ex:
self.log.info(str(ex))
try:
do()
except RecoverableError, ex:
self.log.info('try to recover %s'%ex)
do_recover(ex)
except FatalError, ex:
sef.log.fatal('Fatal error %s, go away as quick as possible'%ex)
sys.exit(ex.retcode)
except Error, ex:
self.log.info('Unrecoverable error %s'%ex)
try:
remove_file()
except FileNotExistsError, ex:
self.log.warning('cannot delete non-existing file: %s'%ex)
# and nothing also. Pass all unexpected errors to caller.
Офлайн
да, в основном только лог пишу и передаю ошибку выше, но уже в качестве строки с описанием. Только для этого и нужно…пока…
Спасибо :)
Отредактировано (Март 10, 2009 08:58:34)
Офлайн
Привет Андрей!:)
Добавь вкусненького в код. Типа “__call__” у исключения перегрузить дабы пользоваться отложенным выполнением по накопленным на момент исключения состояниям.
Или такой подход на поверку окажется страшной ошибкой проектирования ?
ЗЫ: знакомый тебе Андрей который часто изводит оффисный кофе лежа не диване.
Офлайн
andreytata
Привет, Андрей.
А зачем? Мухи отдельно, а котлеты отдельно. Хочешь копить состояния для исключения - сделай collector. Пусть он этим занимается.
Мне всегда было достаточно очень простого класса-исключения. Чаще всего - вообще пустого, просто с наследованием от какого-нибудь RuntimeError.
В крайних случаях добавляется __init__/__str__/__repr__. Все.
Офлайн
Дык и то верно. Читабельность++ :)
Офлайн