首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Python中更改对象的析构函数中的异常?

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

Stack Overflow用户
提问于 2019-03-08 19:42:33
回答 1查看 86关注 0票数 0

下面有一些示例代码,其中我创建了一个对象,然后抛出一个异常。

代码语言:javascript
运行
复制
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')

输出:

代码语言:javascript
运行
复制
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中,因为它只是一个供其他人使用的库。此场景用于调用方或其他库中发生异常时。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-08 23:39:43

一种选择是使用上下文管理器,但这将从根本上改变我们的API。似乎这个问题已经问过了,答案是覆盖内置的异常处理程序。

Setting an exit code for a custom exception in python

我修改的测试代码:

代码语言:javascript
运行
复制
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')

测试输出:

代码语言:javascript
运行
复制
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:\>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55069971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档