2016-02-05 2 views
6

При использовании блоков try/except в Python существует ли рекомендация делегировать его любым методам, которые могут вызвать исключение, или поймать его в родительской функции или и то, и другое?Где помещать обработку исключений в python

Например, какой из следующих вариантов является предпочтительным?

def my_function(): 
    s = something.that.might.go_wrong() 
    return s 

def main(): 
    try: 
     s = my_function() 
    except Exception: 
     print "Error" 

или

def my_function(): 
    try: 
     s = something.that.might.go_wrong() 
     return s 
    except Exception: 
     print "Error" 

def main(): 
    s = my_function() 

PEP 8, кажется, тихо по этому вопросу, и я, кажется, найти примеры обоих случаев во всем мире.

ответ

6

Это действительно зависит от семантики рассматриваемых функций. В общем случае, если вы пишете библиотеку, ваша библиотека, вероятно, должна обрабатывать исключения, которые возникают в библиотеке (возможно, повторно их воссоздавать как новые исключения для библиотеки).

На уровне отдельных функций главное, о чем вы хотите подумать, - это какой контекст/область, в которой вы хотите обработать исключение, - если есть разумная разница, которую вы могли бы сделать в исключительных случаях внутри внутренней функции , было бы полезно обрабатывать его внутри внутренней функции; В противном случае, возможно, имеет смысл обращаться с ним во внешней функции.

Для конкретного случая ввода вывода часто бывает полезно делать это только на самом высоком уровне, а внутренние функции только когда-либо (а) возвращают значения или (б) создают исключения. Это упрощает тестирование кода, потому что вам не нужно беспокоиться о тестировании побочных эффектов.

+0

Спасибо @Amber. Вы хорошо разбираетесь в тестовой способности, которая хорошо сочетается с ответом от AlokThakur. – mcy

0

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

Могут быть случаи, когда вы хотели бы использовать исключения вне функции. Например, если вы хотите напечатать конкретное сообщение, если что-то пойдет не так, вы должны использовать исключение из функции.

Однако вы могли бы предоставить операторы исключений в качестве аргумента функции, если вы хотите дать пользователю возможность решить свое собственное сообщение об исключении. Поэтому я предполагаю, что второй пример (исключение внутри функции) будет универсальным и, следовательно, должен быть предпочтительным.

2

Если вы следуете правилу «одна функция должна обрабатывать одну задачу», тогда вы не должны обрабатывать исключение в этой функции, пусть оно терпит неудачу при неожиданном вводе. Родительская функция, вызывающая такую ​​функцию, может справиться с тем, чтобы дать пользователю лучший опыт.

Мы можем ссылаться на встроенные функции python, чтобы получить pythonic способ

+0

Спасибо @AlokThakur. Ваш ответ имеет смысл и тесно связан с ответом Амбера относительно того, насколько легко проверить функцию. – mcy

Смежные вопросы