Найти - Пользователи
Полная версия: Исключения. Ворпос стиля.
Начало » Python для экспертов » Исключения. Ворпос стиля.
1
ice
Доброго времени суток!

И так задача:
Есть класс. В классе несколько методов. Методы могут возвращать несколько видов ошибок, как то: невозможность чтения/записи на диск невозможность найти объект, невозможность получить данные объекта, системные ошибки и так далее и так далее.
Соответственно нужно сделать исключения для ошибок.

Сейчас на все ошибки у меня один класс с кодом ошибки и доп. сведениями. Ловится это исключение и потом уже принимаются решения в зависимости от кода ошибки.
На сколько это правильно? то есть не стоит ли сделать на каждую ситуацию свое исключение с одним базовым классом?

И какие плюсы/минусы подходов?

Или же тут нет разницы, а только собственное предпочтение?
Андрей Светлов
Ключевой вопрос тут: как эти исключения будут обрабатываться. Если единообразно - то все ложить в один класс.
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)
Примерно так. Еще, если ты предполагаешь обрабатывать только определенные типы ошибок - тоже иерархия. Перехватывать стоит только те исключения, которые умеешь обрабатывать. И практически никогда - Exception. Иначе можно “съесть” какую-нибудь серьезную проблему. А потом долго выяснять, а что же все-таки произошло?
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.
ice
да, в основном только лог пишу и передаю ошибку выше, но уже в качестве строки с описанием. Только для этого и нужно…пока…
Спасибо :)
andreytata
Привет Андрей!:)

Добавь вкусненького в код. Типа “__call__” у исключения перегрузить дабы пользоваться отложенным выполнением по накопленным на момент исключения состояниям.
Или такой подход на поверку окажется страшной ошибкой проектирования ?

ЗЫ: знакомый тебе Андрей который часто изводит оффисный кофе лежа не диване.
Андрей Светлов
andreytata
Привет, Андрей.

А зачем? Мухи отдельно, а котлеты отдельно. Хочешь копить состояния для исключения - сделай collector. Пусть он этим занимается.

Мне всегда было достаточно очень простого класса-исключения. Чаще всего - вообще пустого, просто с наследованием от какого-нибудь RuntimeError.
В крайних случаях добавляется __init__/__str__/__repr__. Все.
andreytata
Дык и то верно. Читабельность++ :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB