gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:00:49 24 4
gpt4 key购买 nike

处理异常时如何判断当前代码是否正在执行?我所说的“处理异常时”是指在 except block 中调用的函数,或者如果捕获特定的异常类型,则在异常的元类中覆盖可选的 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() 是不切实际的。

最佳答案

在 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)

关于Python - 检查当前是否正在处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31921456/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com