预抛出钩子的自定义异常?

2024-09-27 21:34:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要一个Exception类,它在抛出时“做某事”。 虚拟示例:

class BrowserEatRamError(Exception):
    def __raise__(self):
        os.system('Killall -9 chrome')
        super(BrowserEatRamError, self).__raise__()

当我用以下方法扔它时:

raise BrowserEatRamError('Chrome is eating all ram')

Chrome应该在抛出异常之前关闭。有什么神奇的方法可以实现吗?如果不是,那么实现类似行为的最优雅方式是什么?你知道吗

编辑:

我不喜欢使用init,因为即使在try缓存中引发异常,也会调用init。你知道吗


Tags: 方法self示例initosdefexceptionchrome
1条回答
网友
1楼 · 发布于 2024-09-27 21:34:34

不存在这种特殊方法。所有这些都记录在Data model中。你知道吗

假设您使用的是创建和初始化错误,然后引发错误的(相对较好的)实践,即

raise Error(args)

而不是:

err = Error(args)
# Somewhere else
raise err

您可以简单地重载__intit__方法(调用以初始化它)。你知道吗

你也可以试试看。如果经常这样做,可以使用上下文管理器。你知道吗

try:
     # ...
except Exception as e:
    # Reraise if the exception doesn't have a `.on_raise()` method
    # Or that method returns a falsey value.
    if not hasattr(e, 'on_raise') or not e.on_raise():
        raise
class CustomRaiseAction(object):
    def __enter__(self):
        return
    def __exit__(exception_type, exception_value, traceback):
        if hasattr(exception_type, 'on_raise'):
            return exception_type.on_raise(exception_value)
custom_raise_action = CustomRaiseAction()

with custom_raise_action:
    # ...

在这两种方式中,如果on_raise方法返回True,异常将停止传播。如果它返回False(或其他错误值,如None),它将被进一步抛出。你知道吗

您也可以在没有上下文管理器的情况下通过覆盖^{}来实现这一点。这类似于整个程序的__exit__,在程序即将结束时调用,默认情况下显示错误。请注意,如果另一个程序覆盖了它,并且适用于所有情况,包括可能导致意外行为的其他模块,那么这将不起作用。你知道吗

import sys

old_excepthook = sys.excepthook
def new_excepthook(exception_type, exception_value, traceback):
    if hasattr(exception_type, 'on_raise'):
        exception_type.on_raise(exception_value)
    old_excepthook(exception_type, exception_value, traceback)
sys.excepthook = new_excepthook

而且,您不能停止异常并继续。你知道吗

相关问题 更多 >

    热门问题