Python - 检查当前是否正在处理异常

时间:2015-08-10 13:53:59

标签: python exception exception-handling

如何在处理异常时检查当前代码是否正在执行?通过'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()是不切实际的。

1 个答案:

答案 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)