首页 > 解决方案 > Python try-except 块重新引发异常

问题描述

不捕获内部函数的异常而是在调用外部函数时这样做是不好的做法?让我们看两个例子:

选项 a)

def foo(a, b):
    return a / b

def bar(a):
    return foo(a, 0)

try:
    bar(6)
except ZeroDivisionError:
    print("Error!")

优点:更清洁(在我看来)
缺点:如果不查看,您无法分辨出哪些异常bar正在引发foo

选项 b)

def foo(a, b):
    return a / b

def bar(a):
    try:
        ret = foo(a, 0)
    except ZeroDivisionError:
        raise

    return ret

try:
    bar(6)
except ZeroDivisionError:
    print("Error!")

优点:显式
缺点:您只是在编写一个重新引发异常的 try-except 块。在我看来也很丑

其他选择?

我知道,如果您想对异常执行某些操作或将多个异常组合在一起,则选项 b 是唯一的选择。但是,如果您只想按原样重新提出一些特定的例外情况怎么办?

我在 PEP 中找不到任何可以说明这一点的内容。

标签: pythonpep

解决方案


如果您阅读鲍勃叔叔的清洁代码书,您应该始终将逻辑和错误处理分开。这将使选项 a.) 成为首选解决方案。

我个人喜欢这样命名函数:

def _foo(a, b):
    return a / b

def try_foo(a, b):
    try:
        return _foo(a, b)
    except ZeroDivisionError:
        print('Error')


if __name__ == '__main__':
    try_foo(5, 0)        

推荐阅读