Python请求库异常处理

Posted

技术标签:

【中文标题】Python请求库异常处理【英文标题】:Python requests library Exception handling 【发布时间】:2014-08-05 21:27:31 【问题描述】:

我正在使用 python requests 库(请参阅here)创建下载服务,以从另一台服务器下载数据。问题是有时我收到503 error 并且我需要显示适当的消息。请参阅下面的示例代码:

import requests
s = requests.Session()
response = s.get('http://mycustomserver.org/download')

我可以从response.status_code 查看并获取status code = 200。 但是对于特定的错误,我该如何try/catch,在这种情况下,我希望能够检测到503 error 并适当地处理它们。

我该怎么做?

【问题讨论】:

看代码:raw.githubusercontent.com/kennethreitz/requests/master/requests/…,有很多http错误代码,没有每个异常类,而是所有http错误都有一个 【参考方案1】:

为什么不这样做

class MyException(Exception);
   def __init__(self, error_code, error_msg):
       self.error_code = error_code
       self.error_msg = error_msg

import requests
s = requests.Session()
response = s.get('http://mycustomserver.org/download')

if response.status_code == 503:
    raise MyException(503, "503 error code")

编辑:

请求库似乎也会为您使用response.raise_for_status() 引发异常

>>> import requests
>>> requests.get('https://google.com/admin')
<Response [404]>
>>> response = requests.get('https://google.com/admin')
>>> response.raise_for_status()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/requests/models.py", line 638, in raise_for_status
    raise http_error
requests.exceptions.HTTPError: 404 Client Error: Not Found

编辑2:

用下面的try/except包裹你raise_for_status

try:
    if response.status_code == 503:
        response.raise_for_status()
except requests.exceptions.HTTPError as e: 
    if e.response.status_code == 503:
        #handle your 503 specific error

【讨论】:

我在看Errors and Exceptions 部分,想知道哪个能让我赶上503 error。不过还是谢谢。 我明白了 - 添加了相关的 try/except 块。 @MartinKonecny - 如何检查所有错误,而不是一一列出。 ?即 http 错误、错误的 url 错误、ssl 证书错误等......是否有涵盖所有错误的通用异常处理程序?或者我只是以错误的方式解决这个问题? @Stryker 您可以使用except e: 捕获所有异常,然后随着时间的推移添加多个更具体的catches,以便为每种情况提供独特的行为(当然,如果您需要) 【参考方案2】:

你也可以这样做:

try:
    s = requests.Session()
    response = requests.get('http://mycustomserver.org/download')
    if response.status_code == 503:
        response.raise_for_status()
except requests.exceptions.HTTPError:
    print "oops something unexpected happened!"

response.raise_for_status() 引发requests.exceptions.HTTPError,这里我们只在状态码等于 503 时调用response.raise_for_status()

【讨论】:

以上是关于Python请求库异常处理的主要内容,如果未能解决你的问题,请参考以下文章

Python学习之旅---post请求方法异常处理cookie模拟登陆

前端如何尽量正确地处理ajax的异常?

异常处理

Python 异常处理

Python 异常处理

Python-异常处理