如何在Python中的对象的析构函数中更改异常?

时间:2019-03-08 19:42:34

标签: python python-3.x

下面有一些示例代码,我在其中创建一个对象,然后引发异常。

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中,因为它只是供其他人使用的库。这种情况适用于在调用者或某些其他库中发生异常的情况。

有什么想法吗?

1 个答案:

答案 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:\>