在Python中使用try / except块时,是否建议将其委托给可能引发异常的任何方法,或者在父函数中捕获它,或者两者兼而有?
例如,以下哪项是首选?
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在这个问题上似乎很安静,我似乎找到了两种情况的例子。
答案 0 :(得分:6)
这实际上取决于所讨论功能的语义。通常,如果您正在编写库,那么您的库可能应该处理在库中引发的异常(可选地将它们重新提升为新的库特定异常)。
但是,在单个函数级别,您要考虑的主要事项是您希望处理异常的上下文/范围 - 如果在内部函数中的特殊情况下可以执行合理的不同操作,在内部函数中处理它可能是有用的;否则,在外部函数中处理它可能更有意义。
对于编写输出的特定情况,它通常仅用于在最高级别执行此操作,而内部函数仅用于(a)返回值或(b)引发异常。这使得代码更容易测试,因为您不必担心测试副作用输出。
答案 1 :(得分:2)
如果你遵循&#34的规则,一个功能应该处理一个任务"那么你不应该处理该函数中的异常,让它在意外输入时大声失败。调用这种功能的父功能可以处理给用户更好的体验。
我们可以参考python内置函数来获得pythonic方式
答案 2 :(得分:0)
我总是使用第二个。从逻辑上讲,似乎只能在该函数中处理函数的问题。这将为用户提供干净且无障碍的界面,因此您可以稍后将代码放入库中。
在某些情况下,您可能希望在函数外部使用异常。例如,如果您想在出现问题时打印特定消息,那么您应该使用该函数之外的异常。
但是,如果要让用户能够决定自己的异常消息,则可以将异常语句作为函数的参数提供。所以我猜第二个例子(函数内部的例外)将是通用的,因此应该是首选。