Уведомления

Группа в Telegram: @pythonsu

#1 Март 9, 2009 12:21:11

ice
От:
Зарегистрирован: 2008-01-12
Сообщения: 156
Репутация: +  0  -
Профиль   Отправить e-mail  

Исключения. Ворпос стиля.

Доброго времени суток!

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

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

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

Или же тут нет разницы, а только собственное предпочтение?



Офлайн

#2 Март 9, 2009 20:20:40

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Исключения. Ворпос стиля.

Ключевой вопрос тут: как эти исключения будут обрабатываться. Если единообразно - то все ложить в один класс.

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.



Офлайн

#3 Март 10, 2009 08:57:25

ice
От:
Зарегистрирован: 2008-01-12
Сообщения: 156
Репутация: +  0  -
Профиль   Отправить e-mail  

Исключения. Ворпос стиля.

да, в основном только лог пишу и передаю ошибку выше, но уже в качестве строки с описанием. Только для этого и нужно…пока…
Спасибо :)



Отредактировано (Март 10, 2009 08:58:34)

Офлайн

#4 Март 10, 2009 10:12:46

andreytata
От:
Зарегистрирован: 2009-03-03
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Исключения. Ворпос стиля.

Привет Андрей!:)

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

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



Офлайн

#5 Март 10, 2009 12:13:26

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Исключения. Ворпос стиля.

andreytata
Привет, Андрей.

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

Мне всегда было достаточно очень простого класса-исключения. Чаще всего - вообще пустого, просто с наследованием от какого-нибудь RuntimeError.
В крайних случаях добавляется __init__/__str__/__repr__. Все.



Офлайн

#6 Март 10, 2009 14:38:16

andreytata
От:
Зарегистрирован: 2009-03-03
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Исключения. Ворпос стиля.

Дык и то верно. Читабельность++ :)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version