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

Mic*_*ski 5 python exception-handling exception

如何在处理异常时检查当前代码是否正在执行?通过'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'
Run Code Online (Sandbox Code Playgroud)

检查sys.exc_info()是不够的,因为异常往往会保留在那里 - 它们不会自动清除.执法sys.exc_clear()是不切实际的.

Mar*_*ers 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)
Run Code Online (Sandbox Code Playgroud)

在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)
Run Code Online (Sandbox Code Playgroud)