在python中放置异常处理的位置

时间:2016-02-05 03:31:38

标签: python pep8 try-except

在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在这个问题上似乎很安静,我似乎找到了两种情况的例子。

3 个答案:

答案 0 :(得分:6)

这实际上取决于所讨论功能的语义。通常,如果您正在编写库,那么您的库可能应该处理在库中引发的异常(可选地将它们重新提升为新的库特定异常)。

但是,在单个函数级别,您要考虑的主要事项是您希望处理异常的上下文/范围 - 如果在内部函数中的特殊情况下可以执行合理的不同操作,在内部函数中处理它可能是有用的;否则,在外部函数中处理它可能更有意义。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

我总是使用第二个。从逻辑上讲,似乎只能在该函数中处理函数的问题。这将为用户提供干净且无障碍的界面,因此您可以稍后将代码放入库中。

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

但是,如果要让用户能够决定自己的异常消息,则可以将异常语句作为函数的参数提供。所以我猜第二个例子(函数内部的例外)将是通用的,因此应该是首选。