为了账号安全,请及时绑定邮箱和手机立即绑定

在 Python 中实现重试时创建常规异常类

在 Python 中实现重试时创建常规异常类

汪汪一只猫 2022-08-02 11:01:20
正如标题所解释的那样,我想创建一个常规异常类,以从内置的异常类继承,这些异常类稍后将在其他类中捕获。这是我的代码:from functools import wrapsclass ControlledException(TypeError, AttributeError):    """A generic exception on the program's domain."""class WithRetry:    def __init__(self, retries_limit=3, allowed_exceptions=None):        self.retries_limit = retries_limit        self.allowed_exceptions = allowed_exceptions or (ControlledException,)    def __call__(self, operation):        @wraps(operation)        def wrapped(*args, **kwargs):            last_raised = None            for _ in range(self.retries_limit):                try:                    return operation(*args, **kwargs)                except self.allowed_exceptions as e:                    print(f'retrying {operation.__qualname__} due to {e}')                    last_raised = e            raise last_raised        return wrapped@WithRetry()def test(x):    x = x + 1    print(x)test('a')ControlledExceptionclass 继承了两个异常,我想捕获它们。在这种情况下,程序将捕获 .TypeErrorAttributeErrorTypeError我不知道为什么这个参数对(ControlledException,)没有影响。但是,如果我将(ControlledException,)更改为“异常”或“类型错误”,则会捕获错误。self.allowed_exceptions
查看完整描述

1 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

定义此类自定义异常时,要么必须直接使用它们,要么必须捕获原始异常,然后引发自定义异常。raise


在这里,我捕获了原始异常,抑制了它们的回溯并引发了自定义异常。


from functools import wraps



class ControlledException(TypeError, AttributeError):

    """A generic exception on the program's domain."""



class WithRetry:

    def __init__(self, retries_limit=3, allowed_exceptions=None):

        self.retries_limit = retries_limit

        self.allowed_exceptions = allowed_exceptions or (ControlledException,)


    def __call__(self, operation):

        @wraps(operation)

        def wrapped(*args, **kwargs):


            for _ in range(self.retries_limit):

                try:

                    return operation(*args, **kwargs)


                # if you want to catch the error, you have to catch the original

                # exceptions as opposed to custom exceptions

                except (TypeError, AttributeError) as exc:

                    print(f"retrying {operation.__qualname__} due to {exc}")


                    # this suppresses the original error message and raises your

                    # custom exception

                    raise ControlledException("Here is your error message!!") from None


        return wrapped



@WithRetry()

def test(x):

    x = x + 1

    print(x)



test("a")

这将打印出来:


retrying test due to can only concatenate str (not "int") to str

---------------------------------------------------------------------------

ControlledException                       Traceback (most recent call last)

<ipython-input-364-2a7d6eb73e92> in <module>

     38 

     39 

---> 40 test('a')


<ipython-input-364-2a7d6eb73e92> in wrapped(*args, **kwargs)

     27                     # this suppresses the original error message and raises your

     28                     # custom exception

---> 29                     raise ControlledException('Here is your error message!!') from None

     30 

     31         return wrapped


ControlledException: Here is your error message!!


查看完整回答
反对 回复 2022-08-02
  • 1 回答
  • 0 关注
  • 62 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信