获取带有请求的错误消息的简短版本

时间:2016-09-04 15:38:20

标签: python python-requests

我正在使用请求,我需要缩短的例外描述,

    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

有什么想法吗?

1 个答案:

答案 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)

ProxyErrorSSLErrorTimeout的情况相同: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])