下面有一些示例代码,我在其中创建一个对象,然后引发异常。
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中,因为它只是供其他人使用的库。这种情况适用于在调用者或某些其他库中发生异常的情况。
有什么想法吗?
答案 0 :(得分:0)
一个选择是使用上下文管理器,但这将从根本上改变我们的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:\>