当查询API的HTTP响应代码不是200时,我想提出一个Python标准异常,但我应该使用什么特定的异常?现在我提出一个OSError:
if response.status_code != 200:
raise OSError("Response " + str(response.status_code)
+ ": " + response.content)
答案 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
这会为任何4xx
或5xx
响应提出requests.HTTPError
。
有关更完整的示例,请参阅Response Status Code上的文档。
请注意,这不完全符合您的要求(status != 200
):它不会引发201 Created
或204 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
。