Форум сайта python.su
Считается ли хорошем тоном использовать вложенные обработчики исключений? В нормальном коде я не встречал, но возникла необходимость для одного и того же типа исключения определить точку, где оно произошло. Банальный пример:
try:
print 1/0
try:
print 2/0
except ZeroDivisionError as e:
print('Error2: %s' % e)
except ZeroDivisionError as e:
print('Error1: %s' % e)
Офлайн
try:
print 1/0
except ZeroDivisionError as e:
print('Error1: %s' % e)
try:
print 2/0
except ZeroDivisionError as e:
print('Error2: %s' % e)
Офлайн
paganmindEсли так подумать, то можно просто проверять равен ли знаменатель нулю, т.к. try/except здесь фактически только для этого (хотя, конечно, в реальном коде все может быть сложнее).
Возможно ли реализовать как-то по-другому?
Отредактировано (Март 24, 2009 17:50:28)
Офлайн
crchemist:
Это был пример. Если возникло исключение, то второй блок делать не нужно. Например: получение данных и запись их в БД.
ZAN:
Скорее всего да, но тогда получается мешанина с обработчиков исключений и условий. В реальности может быть и исключения получения данных и ошибки ввода/вывода все учесть в условиях не получится
Офлайн
paganmindhttp://docs.python.org/reference/datamodel.html#index-1772
но возникла необходимость для одного и того же типа исключения определить точку, где оно произошло
Офлайн
LexanderВ принципе да, оно, но для разработчика, а не для пользователя.
http://docs.python.org/reference/datamo … index-1772
Офлайн
Лично стараюсь от этого избавляться, хотя пару раз так оказывалось удобно.
paganmindИМХО: однозначно нет.
Считается ли хорошем тоном использовать вложенные обработчики исключений?
Tim Peters
Flat is better than nested.
Офлайн
paganmindТогда тем более не нужно распределять try/except по программе. Изначальная проблема - это нехватка данных в выловленном исключении. Создай свой собственный класс с исключением, который будет хранить всю необходимую информацию для интроспекции. Код выполняется в одном основном try/except блоке:
В реальности может быть и исключения получения данных и ошибки ввода/вывода все учесть в условиях не получится
try:
do_work()
except IOError, e:
log.error('Invalid resource ... ')
except MyZeroDivisionError, e:
log.error('Wrong denominator, %s', e.description)
except Exception, e:
log.error('Unknown exception')
log.exception()
sys.exit()
if var == 0:
raise MyZeroDivisionError("Block 1, describe what's wrong")
#или так
try:
complicated_function_with_many_divisions(arg1, arg2)
except ZeroDivisionError, z:
raise MyZeroDivisionError("Block 2, describe what's wrong", z)
Отредактировано (Март 25, 2009 11:41:45)
Офлайн
ZZZ
ИМХО: однозначно нет.
ZANспасибо. красивое решение.
Изначальная проблема - это нехватка данных в выловленном исключении. Создай свой собственный класс с исключением…..
Офлайн