1

传递具有自定义异常的对象的正确方法是什么?我很确定这段代码曾经可以工作,但现在它抛出了一个错误。

class FailedPostException(Exception):
    pass

def post_request(request):
    session = requests.Session()
    response = session.send(request.prepare(), timeout=5, verify=True)

    if response.status_code is not requests.codes.ok:
        raise FailedPostException(response)

    session.close()
    return response

try:
    ...
except FailedPostException as r:
    // type(r) - Requests.Response
    print r.text

AttributeError: 'FailedPostException' object has no attribute 'text'
4

3 回答 3

6

异常的引发和捕获是正确的,这里的问题是您希望异常具有text不存在的属性。从内置异常类型继承时,您可以使用该args属性,该属性将是异常参数的元组,例如:

try:
    ...
except FailedPostException as r:
    print r.args[0]

在这种情况下,您可以使用str(r)而不是r.args[0]. 如果异常只有一个参数,str(r)则将等价于str(r.args[0]),否则将等价于str(r.args)

如果要将text属性添加到 中FailedPostException,可以执行以下操作:

class FailedPostException(Exception):
    def __init__(self, text, *args):
        super(FailedPostException, self).__init__(text, *args)
        self.text = text

请注意,在 Python 3.x 中,您可以只使用super().__init__(text, *args).

于 2013-05-09T16:21:48.603 回答
2

您可以保留对原始Response对象的引用并公开其属性,如下所示:

class FailedPostException(Exception):
    def __init__(self, rsp):
        super(FailedPostException, self).__init__()
        self.response = rsp
    @property
    def text(self):
        return self.response.text
    @property
    def status_code(self):
        return self.response.status_code
    #other properties if interested....

如果您需要内省更多Response对象

r.response.url
r.response.reason
...
于 2013-05-09T16:32:12.217 回答
1

例外只是另一种类型的对象:

class FailedPostException(Exception):
    def __init__(self, text):
        Exception.__init__(self, text)
        self.text = text

这应该使响应可用.text

于 2013-05-09T16:19:28.690 回答