HTTP响应代码的Python异常

时间:2015-06-15 22:01:36

标签: python http exception

当查询API的HTTP响应代码不是200时,我想提出一个Python标准异常,但我应该使用什么特定的异常?现在我提出一个OSError:

if response.status_code != 200:
  raise OSError("Response " + str(response.status_code)
                  + ": " + response.content)

我了解documentation for built-in exceptions

2 个答案:

答案 0 :(得分:10)

您只需在回复中致电Response.raise_for_status()

>>> import requests
>>> url = 'http://stackoverflow.com/doesnt-exist'
>>> r = requests.get(url)
>>>
>>> print r.status_code
404
>>> r.raise_for_status()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "requests/models.py", line 831, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 404 Client Error: Not Found

这会为任何4xx5xx响应提出requests.HTTPError

有关更完整的示例,请参阅Response Status Code上的文档。

请注意,这完全符合您的要求(status != 200):它不会引发201 Created204 No Content或任何3xx重定向 - 但这很可能是您想要的行为:requests只会遵循重定向,而另一个2xx通常会很好,如果您正在处理API。

答案 1 :(得分:3)

内置的Python异常可能不适合您正在做的事情。您将希望子类化基类Exception,并根据您要通信的每个方案抛出自己的自定义异常。

一个很好的例子是how the Python Requests HTTP library defines its own exceptions

  

如果出现网络问题(例如DNS失败,请拒绝   连接等),请求将引发ConnectionError例外。

     

在极少数情况下,HTTP响应无效,请求将引发   HTTPError例外。

     

如果请求超时,则会引发Timeout异常。

     

如果请求超过配置的最大重定向数,则a   提出了TooManyRedirects异常。

     

请求显式引发继承自的所有异常   requests.exceptions.RequestException