Найти - Пользователи
Полная версия: Хороший стиль и вложенные обработчики исключений
Начало » Python для новичков » Хороший стиль и вложенные обработчики исключений
1
paganmind
Считается ли хорошем тоном использовать вложенные обработчики исключений? В нормальном коде я не встречал, но возникла необходимость для одного и того же типа исключения определить точку, где оно произошло. Банальный пример:

try:
print 1/0
try:
print 2/0
except ZeroDivisionError as e:
print('Error2: %s' % e)
except ZeroDivisionError as e:
print('Error1: %s' % e)
Возможно ли реализовать как-то по-другому?
У меня даже Netbeans отказался код парсить и строить иерархию когда вложил один в другой :-) и показал ошибки
crchemist
try:
print 1/0
except ZeroDivisionError as e:
print('Error1: %s' % e)
try:
print 2/0
except ZeroDivisionError as e:
print('Error2: %s' % e)
ZAN
paganmind
Возможно ли реализовать как-то по-другому?
Eсли так подумать, то можно просто проверять равен ли знаменатель нулю, т.к. try/except здесь фактически только для этого (хотя, конечно, в реальном коде все может быть сложнее).
paganmind
crchemist:
Это был пример. Если возникло исключение, то второй блок делать не нужно. Например: получение данных и запись их в БД.

ZAN:
Скорее всего да, но тогда получается мешанина с обработчиков исключений и условий. В реальности может быть и исключения получения данных и ошибки ввода/вывода все учесть в условиях не получится
Lexander
paganmind
но возникла необходимость для одного и того же типа исключения определить точку, где оно произошло
http://docs.python.org/reference/datamodel.html#index-1772
paganmind
Lexander
http://docs.python.org/reference/datamo … index-1772
В принципе да, оно, но для разработчика, а не для пользователя.

Вообще изначально вопрос был или являтся это хорошим стилем программирования, т.к. все отлично работает, но непревычно. Судя по комментариям, я понял что нет
ZZZ
Лично стараюсь от этого избавляться, хотя пару раз так оказывалось удобно.

paganmind
Считается ли хорошем тоном использовать вложенные обработчики исключений?
ИМХО: однозначно нет.

P.S.
Tim Peters
Flat is better than nested.
ZAN
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)
paganmind
ZZZ
ИМХО: однозначно нет.
ZAN
Изначальная проблема - это нехватка данных в выловленном исключении. Создай свой собственный класс с исключением…..
спасибо. красивое решение.
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