如何在处理异常时检查当前代码是否正在执行?通过'while处理异常',我的意思是在except块中,从它调用的函数,或者如果捕获特定的异常类型,则在异常的元类中可选issubclass
覆盖。
def sth():
handling_exception = # ???
if handling_exception:
print 'handling an exception'
else:
print 'not handling an exception'
try:
1 / 0
except:
sth() # prints 'handling an exception'
sth() # prints 'not handling an exception'
检查sys.exc_info()
是不够的,因为异常往往会保留在那里 - 它们不会自动清除。强制执行sys.exc_clear()
是不切实际的。
答案 0 :(得分:6)
在Python 2中,当您退出捕获它的帧时,sys.exc_info()
将被清除。因此,如果您将try..except
放在函数中,退出该函数将清除sys.exc_info()
。在Python 3中,当您退出异常处理程序时,将清除该信息。
因此,它可用于检测此帧或任何调用帧中是否引发了异常。如果您需要以某种方式检测是否在与try..except
相同的帧内处理异常,您可以提前调用sys.exc_clear()
来促进此异常。
没有其他方法可以检测是否引发和处理了异常。
Python 2中的演示:
>>> import sys
>>> from __future__ import print_function
>>> def baz():
... print('Child frame', sys.exc_info())
...
>>> def foo(clear=False):
... bar(clear)
... print('Calling frame', sys.exc_info())
...
>>> def bar(clear=False):
... try:
... raise ValueError('bar')
... except ValueError:
... print('Handling an exception', sys.exc_info())
... baz()
... if clear: sys.exc_clear()
... print('Frame that handled exception', sys.exc_info())
... baz()
...
>>> def baz():
... print('Child frame', sys.exc_info())
...
>>> foo()
Handling an exception (<type 'exceptions.ValueError'>, ValueError('bar',), <traceback object at 0x10075f6c8>)
Child frame (<type 'exceptions.ValueError'>, ValueError('bar',), <traceback object at 0x10075f6c8>)
Frame that handled exception (<type 'exceptions.ValueError'>, ValueError('bar',), <traceback object at 0x10075f6c8>)
Child frame (<type 'exceptions.ValueError'>, ValueError('bar',), <traceback object at 0x10075f6c8>)
Calling frame (None, None, None)
>>> foo(True)
Handling an exception (<type 'exceptions.ValueError'>, ValueError('bar',), <traceback object at 0x10075f290>)
Child frame (<type 'exceptions.ValueError'>, ValueError('bar',), <traceback object at 0x10075f290>)
Frame that handled exception (None, None, None)
Child frame (None, None, None)
Calling frame (None, None, None)
和Python 3(相同的函数定义):
>>> foo()
Handling an exception (<class 'ValueError'>, ValueError('bar',), <traceback object at 0x10f740e88>)
Child frame (<class 'ValueError'>, ValueError('bar',), <traceback object at 0x10f740e88>)
Frame that handled exception (None, None, None)
Child frame (None, None, None)
Calling frame (None, None, None)