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

Where to put exception handling in python

在 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 似乎对此事保持沉默,我似乎到处都能找到这两种情况的例子。

这实际上取决于相关函数的语义。一般来说,如果您正在编写一个库,您的库可能应该处理在库内部引发的异常(可选择将它们重新引发为新的特定于库的异常)。

不过,在单个函数级别,您要考虑的主要事情是 context/scope 您希望在什么情况下处理异常 - 如果在异常情况下您可以做一些合理的不同事情内部函数,在内部函数中处理它可能会有用;否则,在外部函数中处理它可能更有意义。

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

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

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

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

如果您遵循 "one function should handle one task" 的规则,那么您不应该在该函数中处理异常,让它在意外输入时大声失败。调用此类函数的父函数可以处理以提供更好的用户体验。

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