【发布时间】:2023-03-31 11:21:01
【问题描述】:
不捕获内部函数的异常而是在调用外部函数时这样做是不好的做法?让我们看两个例子:
选项 a)
def foo(a, b):
return a / b
def bar(a):
return foo(a, 0)
try:
bar(6)
except ZeroDivisionError:
print("Error!")
专业版:清洁剂(我认为)
缺点:如果不查看 foo,你无法判断 bar 引发了哪些异常
选项 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 中找不到任何可以说明这一点的内容。
【问题讨论】:
-
为什么你想在选项 b 中再加注?只要调用 bar ,它就会在任何情况下被提升
-
@Karl 这正是我的问题,如果可以写选项 a。问题是您并不立即知道通过查看代码会引发哪些异常栏。因此,重新加注的一个可能论点是明确的。
-
我会选择选项 a。如果您想知道异常的来源,您可以随时查看堆栈跟踪
-
我认为最好的方法是直接在可能发生异常的函数中处理异常(即在“bar”内)。 IE。和选项 b) 一样,但没有再次加注,为什么你叫 "bar(6)"。选项 b) 的问题是每次调用函数时都必须构建执行处理。如果它自己处理异常会更好。
-
对不起,最后一句应该是“选项a)的问题”