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:
捕获所有异常,然后随着时间的推移添加多个更具体的catch
es,以便为每种情况提供独特的行为(当然,如果您需要)
【参考方案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请求库异常处理的主要内容,如果未能解决你的问题,请参考以下文章