Уведомления

Группа в Telegram: @pythonsu

#1 Март 24, 2009 17:29:02

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

Хороший стиль и вложенные обработчики исключений

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

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 отказался код парсить и строить иерархию когда вложил один в другой :-) и показал ошибки



Офлайн

#2 Март 24, 2009 17:47:56

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

Хороший стиль и вложенные обработчики исключений

try:
print 1/0
except ZeroDivisionError as e:
print('Error1: %s' % e)
try:
print 2/0
except ZeroDivisionError as e:
print('Error2: %s' % e)



Офлайн

#3 Март 24, 2009 17:49:54

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Хороший стиль и вложенные обработчики исключений

paganmind
Возможно ли реализовать как-то по-другому?
Eсли так подумать, то можно просто проверять равен ли знаменатель нулю, т.к. try/except здесь фактически только для этого (хотя, конечно, в реальном коде все может быть сложнее).



Отредактировано (Март 24, 2009 17:50:28)

Офлайн

#4 Март 24, 2009 17:58:37

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

Хороший стиль и вложенные обработчики исключений

crchemist:
Это был пример. Если возникло исключение, то второй блок делать не нужно. Например: получение данных и запись их в БД.

ZAN:
Скорее всего да, но тогда получается мешанина с обработчиков исключений и условий. В реальности может быть и исключения получения данных и ошибки ввода/вывода все учесть в условиях не получится



Офлайн

#5 Март 24, 2009 19:08:40

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Хороший стиль и вложенные обработчики исключений

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



Офлайн

#6 Март 24, 2009 19:19:56

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

Хороший стиль и вложенные обработчики исключений

Lexander
http://docs.python.org/reference/datamo … index-1772
В принципе да, оно, но для разработчика, а не для пользователя.

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



Офлайн

#7 Март 24, 2009 23:34:33

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Хороший стиль и вложенные обработчики исключений

Лично стараюсь от этого избавляться, хотя пару раз так оказывалось удобно.

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

P.S.
Tim Peters
Flat is better than nested.



Офлайн

#8 Март 25, 2009 10:56:11

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Хороший стиль и вложенные обработчики исключений

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)

Офлайн

#9 Март 25, 2009 11:12:34

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

Хороший стиль и вложенные обработчики исключений

ZZZ
ИМХО: однозначно нет.
ZAN
Изначальная проблема - это нехватка данных в выловленном исключении. Создай свой собственный класс с исключением…..
спасибо. красивое решение.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version