尝试/不使用Python请求模块的正确方法?

尝试/不使用Python请求模块的正确方法?,python,request,python-requests,Python,Request,Python Requests,这是正确的吗?有没有更好的方法来组织这个?这能覆盖我所有的基地吗 看看这些请求。简言之: 如果出现网络问题(例如DNS故障、连接被拒绝等),请求将引发异常 如果出现罕见的无效HTTP响应,请求将引发异常 如果请求超时,则引发异常 如果请求超过配置的最大重定向数,则引发异常 请求显式引发的所有异常都继承自请求。异常。RequestException 为了回答你的问题,你所展示的不会涵盖你所有的基础。您将只捕获与连接相关的错误,而不是超时的错误 捕获异常时要做什么实际上取决于脚本/程序的设计。可以退

这是正确的吗?有没有更好的方法来组织这个?这能覆盖我所有的基地吗

看看这些请求。简言之:

如果出现网络问题(例如DNS故障、连接被拒绝等),请求将引发异常

如果出现罕见的无效HTTP响应,请求将引发异常

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

如果请求超过配置的最大重定向数,则引发异常

请求显式引发的所有异常都继承自
请求。异常。RequestException

为了回答你的问题,你所展示的不会涵盖你所有的基础。您将只捕获与连接相关的错误,而不是超时的错误

捕获异常时要做什么实际上取决于脚本/程序的设计。可以退出吗?你能继续再试一次吗?如果错误是灾难性的,您无法继续,那么是的,您可以通过引发(打印错误和调用
sys.exit
)来中止程序

您可以捕获基类异常,该异常将处理所有情况:

try:
    r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
    print e #should I also sys.exit(1) after this?
或者你可以单独捕捉它们,做不同的事情

try:
    r = requests.get(url, params={'s': thing})
except requests.exceptions.RequestException as e:  # This is the correct syntax
    raise SystemExit(e)

正如所指出的那样:

如果希望http错误(例如401未经授权)引发异常,可以调用。如果响应是http错误,则会引发
HTTPError

例如:

try:
    r = requests.get(url, params={'s': thing})
except requests.exceptions.Timeout:
    # Maybe set up for a retry, or continue in a retry loop
except requests.exceptions.TooManyRedirects:
    # Tell the user their URL was bad and try a different one
except requests.exceptions.RequestException as e:
    # catastrophic error. bail.
    raise SystemExit(e)
将打印:

404客户端错误:找不到url:http://www.google.com/nothere

需要明确的另一个建议。似乎最好从一堆特定的错误到一堆一般的错误,以获得想要捕获的错误,这样特定的错误就不会被一般的错误掩盖

try:
    r = requests.get('http://www.google.com/nothere')
    r.raise_for_status()
except requests.exceptions.HTTPError as err:
    raise SystemExit(err)
vs


Exception对象还包含原始响应
e.response
,如果需要查看服务器响应中的错误体,这可能很有用。例如:

url='http://www.google.com/blahblah'

try:
    r = requests.get(url,timeout=3)
    r.raise_for_status()
except requests.exceptions.RequestException as err:
    print ("OOps: Something Else",err)
except requests.exceptions.HTTPError as errh:
    print ("Http Error:",errh)
except requests.exceptions.ConnectionError as errc:
    print ("Error Connecting:",errc)
except requests.exceptions.Timeout as errt:
    print ("Timeout Error:",errt)     

OOps: Something Else 404 Client Error: Not Found for url: http://www.google.com/blahblah

对于处理请求库的细节和一般异常捕获来说,这是一个非常好的答案。请注意,由于底层urllib3库中存在错误,您还需要捕获
socket。如果您使用超时,则超时
异常:未来的注释阅读器:这在requests 2.9(绑定urllib3 1.13)中已修复如果希望http错误(例如401未经授权)引发异常,可以调用。如果响应是http错误,则将引发HTTPError。上的异常列表不完整。你可以阅读完整的列表。这对post也是有效的语法吗?@ScipioAfricanus是的。
url='http://www.google.com/blahblah'

try:
    r = requests.get(url,timeout=3)
    r.raise_for_status()
except requests.exceptions.RequestException as err:
    print ("OOps: Something Else",err)
except requests.exceptions.HTTPError as errh:
    print ("Http Error:",errh)
except requests.exceptions.ConnectionError as errc:
    print ("Error Connecting:",errc)
except requests.exceptions.Timeout as errt:
    print ("Timeout Error:",errt)     

OOps: Something Else 404 Client Error: Not Found for url: http://www.google.com/blahblah
try:
    r = requests.post('somerestapi.com/post-here', data={'birthday': '9/9/3999'})
    r.raise_for_status()
except requests.exceptions.HTTPError as e:
    print (e.response.text)