我正在使用请求,我需要缩短的例外描述,
try:
resp = requests.get(url)
except Exception, e:
data['error'] = str(e)
例如,对于连接错误,str(e)
变为('Connection aborted.', error(61, 'Connection refused'))
我只想检索Connection aborted.
部分。
根据Exception
课程的文档,e.strerror
应该有效,但print (e.strerror)
显示None
有什么想法吗?
答案 0 :(得分:1)
Exception
类是所有用户定义的异常的基类(它是一个推荐)。
此类继承具有args
属性的BaseException
。
该属性定义如下:
<强> ARGS 强>
赋予异常构造函数的参数元组。一些内置异常(如OSError)期望一定数量的参数并为此元组的元素赋予特殊含义,而其他异常通常仅使用单个字符串调用给出错误消息。
如果错误消息在args[0]
中,您可以尝试:
try:
resp = requests.get(url)
except Exception as e:
data['error'] = e.args[0]
您没有提到标准例外情况,因为print (e.strerror)
应该提出AttributeError
。
对于你的答案,你应该考虑这个问题的答案:Correct way to try/except using Python requests module?
所有请求异常都继承requests.exceptions.RequestException
,继承IOError
。
关于IOError
,文档说:
异常EnvironmentError
可能在Python系统外发生的异常的基类:IOError,OSError。 当使用2元组创建此类型的例外时,第一个项目在实例的 errno 属性上可用(假设它是一个错误编号),并且第二项可用于 strerror 属性(通常是关联的错误消息)。元组本身也可以在args属性中使用。
但RequestException
似乎不是用2元组创建的,因此 strerror 是None
。
编辑:添加一些示例:
如果您有HTTPError
,则原始邮件位于args[0]
。请参阅requests.models.Response.raise_for_status
中的此代码示例:
if http_error_msg:
raise HTTPError(http_error_msg, response=self)
如果您有ConnectionError
,则args[0]
包含原始错误。请参阅requests.adapters.HTTPAdapter.send
中的此示例:
except (ProtocolError, socket.error) as err:
raise ConnectionError(err, request=request)
ProxyError
,SSLError
,Timeout
的情况相同:args[0]
包含原始错误。
...
浏览GitHub repo。
中的源代码一个解决方案可能是:
try:
resp = requests.get(url)
except requests.exceptions.HTTPError as e:
data['error'] = e.args[0]
except requests.exceptions.RequestException as e:
cause = e.args[0]
data['error'] = str(cause.args[0])