Question

I was wondering, is there a simple magic method in python that allows customization of the behaviour of an exception-derived object when it is raised? I'm looking for something like __raise__ if that exists. If no such magic methods exist, is there any way I could do something like the following (it's just an example to prove my point):

class SpecialException(Exception):
    def __raise__(self):
        print('Error!')

raise SpecialException() #this is the part of the code that must stay

Is it possible?

Was it helpful?

Solution

I don't know about such magic method but even if it existed it is just some piece of code that gets executed before actually raising the exception object. Assuming that its a good practice to raise exception objects that are instantiated in-place you can put such code into the __init__ of the exception. Another workaround: instead of raising your exception directly you call an error handling method/function that executes special code and then finally raises an exception.

OTHER TIPS

import time
from functools import wraps


def capture_exception(callback=None, *c_args, **c_kwargs):
    """捕获到异常后执行回调函数"""
    assert callable(callback), "callback 必须是可执行对象"

    def _out(func):
        @wraps(func)
        def _inner(*args, **kwargs):
            try:
                res = func(*args, **kwargs)
                return res
            except Exception as e:
                callback(*c_args, **c_kwargs)
                raise e

        return _inner

    return _out


def send_warning():
    print("warning message..............")


class A(object):
    @capture_exception(callback=send_warning)
    def run(self):
        print('run')
        raise SystemError("测试异常捕获回调功能")
        time.sleep(0.2)


if __name__ == '__main__':
    a = A()
    a.run()

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top