使用自定义异常传递对象的正确方法是什么?我很确定这个代码使用来工作,但现在却抛出了错误。
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'
答案 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