Разделение, кроме части try/except, на функцию

У меня есть попытка/кроме, где я часто повторяю часть исключения в своем коде. Это натолкнуло меня на мысль, что было бы лучше выделить часть исключений в функцию.

Ниже мой вариант использования:

try:
  ...
except api.error.ReadError as e:
  ...
except api.error.APIConnectionError as e:
  ...
except Exception as e:
  ...

Как бы я разделил эту логику на функцию, чтобы я мог сделать что-то простое, например:

try:
  ...
except:
  my_error_handling_function(e)

person Michael Smith    schedule 28.06.2016    source источник
comment
Как насчет того, чтобы создать собственный класс ошибок, чтобы вы могли просто отлавливать один вид ошибок?   -  person Andrew Jaffe    schedule 28.06.2016
comment
Вам не нужно перехватывать каждое исключение отдельно, если они обрабатываются одинаково: except (api.error.ReadError, api.error.APIConnectionError, Exception) as e: Если они обрабатываются по-разному, не используйте одну функцию для их обработки.   -  person chepner    schedule 28.06.2016


Ответы (3)


Просто определите функцию:

def my_error_handling(e):
    #Do stuff

... и передать объект exception в качестве параметра:

try:
    #some code
except Exception as e:
    my_error_handling(e)

Использование только общего типа Exception позволит вам иметь одно предложение except и обрабатывать и тестировать различные типы ошибок в вашей функции обработки.

Чтобы проверить имя перехваченного исключения, вы можете получить его, выполнив:

type(e).__name__

Который будет печатать имя, например ValueError, IOError и т. д.

person m_callens    schedule 28.06.2016
comment
Я понимаю эту часть, но я не уверен, как будет выглядеть my_error_handling(e) в контексте моих трех вариантов использования. - person Michael Smith; 28.06.2016
comment
@MichaelSmith, вы просто делаете if утверждения, чтобы проверить, например, if type(e).__name__ == 'ReadError' - person m_callens; 28.06.2016
comment
Это то, что я искал! Скоро попробую. - person Michael Smith; 28.06.2016

Я бы предложил реорганизовать ваш код, чтобы блок try/except присутствовал только в одном месте.

Например, класс API с методом send() кажется разумным кандидатом для содержания логики обработки ошибок, которую вы описали в своем вопросе.

person David Smith    schedule 28.06.2016

Определите свою функцию:

def my_error_handling(e):
    #Handle exception

И делайте то, что вы предлагаете:

try:
  ...
except Exception as e:
  my_error_handling_function(e)

Вы можете обрабатывать логику, получая тип исключения «e» в своей функции. См.: python: как узнать, какой тип исключения произошло?

person Checkmate    schedule 28.06.2016
comment
Вы пытаетесь/кроме того, что не поймаете, не присваиваете ни значение e для передачи, ни какой-либо указанный тип Exception - person m_callens; 28.06.2016
comment
Но как в этот момент функция my_error_handling узнает, какую логику выполнять для трех разных случаев исключений? - person Michael Smith; 28.06.2016
comment
@MichaelSmith Я обновил свой пост, чтобы включить эту проверку - person m_callens; 28.06.2016
comment
Извините, забыл включить определение для e. - person Checkmate; 28.06.2016