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

发布于 2021-02-02 23:15:18

try:
    r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
    print e #should I also sys.exit(1) after this?

它是否正确?有没有更好的方法来构造它?这会覆盖我所有的基地吗?

关注者
0
被浏览
75
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    看一下Requests 异常文档。简而言之:

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

    如果发生罕见的无效HTTP响应,则请求将引发HTTPError异常。

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

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

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

    要回答你的问题,你显示的内容不会涵盖所有基础。你将只捕获与连接有关的错误,而不是超时的错误。

    捕获异常时该做什么实际上取决于脚本/程序的设计。退出是否可以接受?你可以继续重试吗?如果错误是灾难性的,并且你无法继续操作,那么可以的是,有个调用sys.exit()

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

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

    或者,你可以分别捕获它们并执行不同的操作。

    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.
        print e
        sys.exit(1)
    

    正如克里斯蒂安指出:

    如果你希望http错误(例如401未经授权)引发异常,可以致电Response.raise_for_status。HTTPError如果响应是http错误,则将引发。

    一个例子:

    try:
        r = requests.get('http://www.google.com/nothere')
        r.raise_for_status()
    except requests.exceptions.HTTPError as err:
        print err
        sys.exit(1)
    

    将打印:

    404 Client Error: Not Found for url: http://www.google.com/nothere
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看