我应该如何“重新抛出”异常,即假设:
- 我在我的代码中尝试了一些东西,不幸的是它失败了。
- 我尝试了一些“聪明”的解决方法,但这次也失败了
如果我从(失败的)解决方法中抛出异常,这会让用户感到非常困惑,所以我认为最好重新抛出原始异常(?),并带有它附带的描述性回溯(关于实际问题)...
注意:这方面的激励示例是在调用 时np.log(np.array(['1'], dtype=object))
,它会尝试一种机智的解决方法并给出一个AttributeError
(它“真的”是 a TypeError
)。
我能想到的一种方法就是重新调用有问题的函数,但这似乎是顽固的(一方面,理论上原始函数在第二次调用时可能会表现出一些不同的行为):
好吧,这是一个糟糕的例子,但是这里有...
def f():
raise Exception("sparrow")
def g():
raise Exception("coconut")
def a():
f()
假设我这样做:
try:
a()
except:
# attempt witty workaround
g()
---------------------------------------------------------------------------
Exception Traceback (most recent call last)
<ipython-input-4-c76b7509b315> in <module>()
3 except:
4 # attempt witty workaround
----> 5 g()
6
<ipython-input-2-e641f2f9a7dc> in g()
4
5 def g():
----> 6 raise Exception("coconut")
7
8
Exception: coconut
好吧,问题根本不在于椰子,而在于麻雀:
try:
a()
except:
# attempt witty workaround
try:
g()
except:
# workaround failed, I want to rethrow the exception from calling a()
a() # ideally don't want to call a() again
---------------------------------------------------------------------------
Exception Traceback (most recent call last)
<ipython-input-4-e641f2f9a7dc> in <module>()
19 except:
20 # workaround failed, I want to rethrow the exception from calling a()
---> 21 a() # ideally don't want to call a() again
<ipython-input-3-e641f2f9a7dc> in a()
8
9 def a():
---> 10 f()
11
12
<ipython-input-1-e641f2f9a7dc> in f()
1 def f():
----> 2 raise Exception("sparrow")
3
4
5 def g():
Exception: sparrow
有没有标准的方法来处理这个问题,还是我认为它完全错误?