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()是不切实际的.
在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)
| 归档时间: |
|
| 查看次数: |
1462 次 |
| 最近记录: |