2016-02-05 63 views
6

在Python中使用try/except块时,是否有建议将它委托给可能引发异常,或在父函数中捕获它的方法?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

它确实取决于有问题的函数的语义。一般来说,如果你正在编写一个库,你的库可能应该处理在库内引发的异常(可选地将它们重新提升为新的特定于库的异常)。

但是,在个人功能层面上,您想要考虑的主要问题是您希望处理异常的上下文/范围 - 如果在内部函数内例外情况下可以执行合理的不同操作,在内部函数中处理它可能很有用;否则,在外部函数中处理它可能更有意义。

对于编写输出的具体情况,仅在最高级别执行该操作通常是有用的,并且只有内部函数(a)返回值或(b)引发异常。这使代码更容易测试,因为您不必担心测试副作用输出。

+0

谢谢@Amber。你在考试能力方面做得很好,这与AlokThakur的答案很好地结合在一起。 – mcy

0

我总是使用第二个。对我来说,似乎应该只在该函数中处理函数的问题。这将为用户提供一个干净且无障碍的界面,以便您稍后可以将您的代码放入一个库中。

可能有些情况下,您希望在函数外使用异常。例如,如果您想在出现问题时打印特定消息,则应该使用该功能以外的例外。

但是,如果您想让用户能够决定自己的异常消息,则可以将异常声明作为参数提供给函数。所以我想第二个例子(函数内的异常)将是普遍的,因此应该是首选。

2

如果您遵循“一个函数应该处理一个任务”的规则,那么您不应该在该函数中处理异常,让它在意外输入时大声地失败。调用这种功能的父功能可以处理给用户更好的体验。

我们可以参考python内置函数来获取pythonic方式

+0

谢谢@AlokThakur。您的回答是有道理的,并且与琥珀关于测试功能的容易程度的答案密切相关。 – mcy