python函数中使用try/except块有哪些未知问题?

What are the unknown issues of using try/except block in functions in python?

我想知道在以下方法中使用 try/except 块的副作用或未知问题?

方法一:

def f1():
    try:    
        # some code here
    except Exception as e:
        print(str(e))
def f2():
    try:
        f1()
    except Exception as e:
        print(str(e))

方法 2:与方法 1 相同的逻辑,但在 f1()

中没有 try/block
def f1():
    # some code here

def f2():
    try:
        f1()
    except Exception as e:
        print(str(e))

方法 3:使用多个嵌套函数

def f1():
    # some code here

def f4():
    # some code here

def f3():
    f4()
    # some code here

def f2():
    try:
        f1()
        f3()
    except Exception as e:
        print(str(e))

方法 4:在每个函数中添加多个 try/except

def f1():
    try:
        # some code here
    except Exception as e:
        print(str(e))

def f4():
    try:
        # some code here
    except Exception as e:
        print(str(e))

def f3():
    try:
        f4()
        # some code here
    except Exception as e:
        print(str(e))

def f2():
    try:
        f1()
        f3()
    except Exception as e:
        print(str(e))

在使用 try/except 时默默地失败是危险的。在我看来,可重用函数没有太多关于调用者如何处理异常的上下文(信息),最好抛出异常由调用者处理。

如果您正在处理可重用函数的异常,那么它的行为应该是可预测和一致的。就像你可能想要 return 回退值,或者你可能想要为用户等

抛出具有足够上下文的另一个错误

所以我更喜欢调用者处理异常的方法 3

了解在代码中的何处捕获异常是一项重要的设计选择,并且通常取决于您期望捕获哪些异常。

有异常的概念'bubbling up' - 如果在内部函数中引发异常但没有 try 块,异常将传递给调用它的函数。这一直持续到满足适当的 except 语句并处理异常,或者它到达顶层并导致程序终止并显示堆栈跟踪。

因此,选择在何处处理异常取决于您希望函数抛出哪些异常,然后在代码中的适当位置处理这些异常,例如您可以在其中 return 向用户发送有意义的消息并要求他们重试。您定义的任何方法都没有明显错误,但这取决于函数引发的内容以及您希望如何处理异常。

值得注意的是 except Exception 是一种不好的做法,因为这甚至会捕获键盘中断(用户按下 CTRL+C)。在可能的情况下,您应该处理您调用的函数抛出的特定异常(应该在函数文档中)并采取适当的措施。

有用的背景https://docs.python.org/3/tutorial/errors.html