tlndr:如何在函数中判断它是否是从except
块中调用的(直接/间接)。python2.7/cpython。
__context__
我使用 python 2.7 并尝试为我的自定义异常类提供类似于 py3 的内容:
class MyErr(Exception):
def __init__(self, *args):
Exception.__init__(self, *args)
self.context = sys.exc_info()[1]
def __str__(self):
return repr(self.args) + ' from ' + repr(self.context)
这似乎工作正常:
try:
1/0
except:
raise MyErr('bang!')
#>__main__.MyErr: ('bang!',) from ZeroDivisionError('integer division or modulo by zero',)
有时我需要MyErr
在异常块之外提出。这也很好:
raise MyErr('just so')
#>__main__.MyErr: ('just so',) from None
但是,如果在此之前已处理异常,则它被错误地设置为以下上下文MyErr
:
try:
print xxx
except Exception as e:
pass
# ...1000 lines of code....
raise MyErr('look out')
#>__main__.MyErr: ('look out',) from NameError("name 'xxx' is not defined",) <-- BAD
我猜原因是 sys.exc_info
只返回“最后一个”而不是“当前”异常:
此函数返回三个值的元组,这些值提供有关当前正在处理的异常的信息。<...> 这里,“处理异常”被定义为“执行或已经执行了一个 except 子句”。
所以,我的问题是:如何判断解释器是否正在执行一个except
子句(而不是过去执行过)。换句话说:有没有办法知道堆栈上MyErr.__init__
是否有一个向上的?except
我的应用程序不可移植,欢迎任何 Cpython 特定的黑客。