下面有一些示例代码,其中我创建了一个对象,然后抛出一个异常。
import sys
class Abc(object):
def __init__(self):
pass
def __del__(self):
print('>>>>>>>>>>>>del')
sys.exit(12)
print('before')
a = Abc()
print('after')
raise Exception('asd')输出:
before
after
Traceback (most recent call last):
File "C:\development\test.py", line 13, in <module>
raise Exception('asd')
Exception: asd
>>>>>>>>>>>>del
Exception ignored in: <bound method Abc.__del__ of <__main__.Abc object at 0x007E2BB0>>
Traceback (most recent call last):
File "C:\development\aft-system\components\Core\src\python\PythonAPI\sel\aft\tests\regression_tests\exit_code_tests\test.py", line 9, in __del__
SystemExit: 12正如您所看到的,析构函数是被调用的,但我似乎无法在其中找到调试器。如果可能的话,我想访问异常并更改退出代码。
如您所见,调用了sys.exit,但这会引发一个被当前异常忽略的异常。
我应该注意,我不能将它包装在try/catch中,因为它只是一个供其他人使用的库。此场景用于调用方或其他库中发生异常时。
有什么想法吗?
发布于 2019-03-08 23:39:43
一种选择是使用上下文管理器,但这将从根本上改变我们的API。似乎这个问题已经问过了,答案是覆盖内置的异常处理程序。
Setting an exit code for a custom exception in python
我修改的测试代码:
import sys
import traceback
class Abc(object):
def __init__(self):
self._original_except_hook = sys.excepthook
sys.excepthook = Abc.exception_hook
@staticmethod
def exception_hook(exc_type, exc_value, trace, *_):
"""Override the built-in Python exception handler."""
traceback.print_exception(exc_type, exc_value, trace)
sys.exit(12)
a = Abc()
raise Exception('asd')测试输出:
PS C:\> python C:\development\test.py ; $LASTEXITCODE
Traceback (most recent call last):
File "C:\development\test.py", line 17, in <module>
raise Exception('asd')
Exception: asd
12
PS C:\>https://stackoverflow.com/questions/55069971
复制相似问题