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

mcy*_*mcy 6 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"
Run Code Online (Sandbox Code Playgroud)

要么

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

def main():
    s = my_function()
Run Code Online (Sandbox Code Playgroud)

PEP 8在这个问题上似乎很安静,我似乎找到了两个案例的例子.

Amb*_*ber 6

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

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

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