关于python:如何从异常继承来创建更具体的错误?

How to inherit from an exception to create a more specific Error?

我正在使用第三方API,它发出HttpError

通过捕获此错误,我可以检查http响应状态并缩小问题范围。 所以现在我想发出一个更具体的HttpError,我将配音BackendErrorRatelimitError。 后者具有要添加的上下文变量。

如何创建一个继承自HttpError的自定义异常,并且可以在不丢失原始异常的情况下创建该异常?

问题实际上是多态性101,但今天我的头脑模糊:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class BackendError(HttpError):
   """The Google API is having it's own issues"""
    def __init__(self, ex):
        # super doesn't seem right because I already have
        # the exception. Surely I don't need to extract the
        # relevant bits from ex and call __init__ again?!
        # self = ex   # doesn't feel right either


try:
     stuff()
except HttpError as ex:
     if ex.resp.status == 500:
         raise BackendError(ex)

我们如何捕获原始的HttpError并封装它,因此它仍然可以识别为HttpError和BackendError?


如果你看一下googleapiclient.errors.HttpError的实际定义,

1
__init__(self, resp, content, uri=None)

因此,在继承之后,您需要使用所有这些值初始化基类。

1
2
3
4
5
6
7
class BackendError(HttpError):
   """The Google API is having it's own issues"""
    def __init__(self, resp, content, uri=None):
        # Invoke the super class's __init__
        super(BackendError, self).__init__(resp, content, uri)

        # Customization can be done here

然后当你发现错误,

1
2
3
except HttpError as ex:
     if ex.resp.status == 500:
         raise BackendError(ex.resp, ex.content, ex.uri)

如果您不希望客户端显式解压缩内容,您可以接受BackendError__init__中的HTTPError对象,然后您可以执行解压缩,如下所示

1
2
3
4
5
6
7
class BackendError(HttpError):
   """The Google API is having it's own issues"""
    def __init__(self, ex):
        # Invoke the super class's __init__
        super(BackendError, self).__init__(ex.resp, ex.content, ex.uri)

        # Customization can be done here

然后你就可以做到

1
2
3
except HttpError as ex:
     if ex.resp.status == 500:
         raise BackendError(ex)