How to inherit from an exception to create a more specific Error?
我正在使用第三方API,它发出
通过捕获此错误,我可以检查http响应状态并缩小问题范围。 所以现在我想发出一个更具体的HttpError,我将配音
如何创建一个继承自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?
如果你看一下
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) |
如果您不希望客户端显式解压缩内容,您可以接受
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) |