传递带有异常的对象?

时间:2013-05-09 16:18:03

标签: python exception

使用自定义异常传递对象的正确方法是什么?我很确定这个代码使用来工作,但现在却抛出了错误。

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'

3 个答案:

答案 0 :(得分:4)

异常的引发和捕获是正确的,这里的问题是您希望异常具有不存在的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)

答案 1 :(得分: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
...

答案 2 :(得分:1)

异常只是另一种类型的对象:

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

这应该使响应可用.text