zoukankan      html  css  js  c++  java
  • 【Python3网络爬虫开发实战】3.1.2-处理异常

    【摘要】 前一节我们了解了请求的发送过程,但是在网络不好的情况下,如果出现了异常,该怎么办呢?这时如果不处理这些异常,程序很可能因报错而终止运行,所以异常处理还是十分有必要的。

    urllib的error模块定义了由request模块产生的异常。如果出现了问题,request模块便会抛出error模块中定义的异常。

    1. URLError

    URLError类来自urllib库的error模块,它继承自OSError类,是error异常模块的基类,由request模块生的异常都可以通过捕获这个类来处理。

    它具有一个属性reason,即返回错误的原因。

    下面用一个实例来看一下:

    from urllib import request, error
    try:
        response = request.urlopen('http://cuiqingcai.com/index.htm')
    except error.URLError as e:
        print(e.reason)

    我们打开一个不存在的页面,照理来说应该会报错,但是这时我们捕获了URLError这个异常,运行结果如下:

    Not Found

    程序没有直接报错,而是输出了如上内容,这样通过如上操作,我们就可以避免程序异常终止,同时异常得到了有效处理。

    2. HTTPError

    它是URLError的子类,专门用来处理HTTP请求错误,比如认证请求失败等。它有如下3个属性。

    code:返回HTTP状态码,比如404表示网页不存在,500表示服务器内部错误等。

    reason:同父类一样,用于返回错误的原因。

    headers:返回请求头。

    下面我们用几个实例来看看:

    from urllib import request,error
    try:
        response = request.urlopen('http://cuiqingcai.com/index.htm')
    except error.HTTPError as e:
        print(e.reason, e.code, e.headers, sep='
    ')

    运行结果如下:

    Not Found
    404
    Server: nginx/1.4.6 (Ubuntu)
    Date: Wed, 03 Aug 2016 08:54:22 GMT
    Content-Type: text/html; charset=UTF-8
    Transfer-Encoding: chunked
    Connection: close
    X-Powered-By: PHP/5.5.9-1ubuntu4.14
    Vary: Cookie
    Expires: Wed, 11 Jan 1984 05:00:00 GMT
    Cache-Control: no-cache, must-revalidate, max-age=0
    Pragma: no-cache
    Link: <http://cuiqingcai.com/wp-json/>; rel="https://api.w.org/"

    依然是同样的网址,这里捕获了HTTPError异常,输出了reason、code和headers属性。

    因为URLError是HTTPError的父类,所以可以先选择捕获子类的错误,再去捕获父类的错误,所以上述代码更好的写法如下:

    from urllib import request, error
    
    try:
        response = request.urlopen('http://cuiqingcai.com/index.htm')
    except error.HTTPError as e:
        print(e.reason, e.code, e.headers, sep='
    ')
    except error.URLError as e:
        print(e.reason)
    else:
        print('Request Successfully')

    这样就可以做到先捕获HTTPError,获取它的错误状态码、原因、headers等信息。如果不是HTTPError异常,就会捕获URLError异常,输出错误原因。最后,用else来处理正常的逻辑。这是一个较好的异常处理写法。

    有时候,reason属性返回的不一定是字符串,也可能是一个对象。再看下面的实例:

    import socket
    import urllib.request
    import urllib.error
    
    try:
        response = urllib.request.urlopen('https://www.baidu.com', timeout=0.01)
    except urllib.error.URLError as e:
        print(type(e.reason))
        if isinstance(e.reason, socket.timeout):
            print('TIME OUT')

    这里我们直接设置超时时间来强制抛出timeout异常。

    运行结果如下:

    <class 'socket.timeout'>
    TIME OUT

    可以发现,reason属性的结果是socket.timeout类。所以,这里我们可以用isinstance()方法来判断它的类型,作出更详细的异常判断。

    本节中,我们讲述了error模块的相关用法,通过合理地捕获异常可以做出更准确的异常判断,使程序更加稳健。

    来源:华为云社区  作者:崔庆才丨静觅

  • 相关阅读:
    8.10
    今日头条笔试题 1~n的每个数,按字典序排完序后,第m个数是什么?
    Gym 100500B Conference Room(最小表示法,哈希)
    CodeForces 438D The Child and Sequence(线段树)
    UVALIVE 6905 Two Yachts(最小费用最大流)
    Gym Conference Room (最小表示法,哈希)
    hdu 2389 Rain on your Parade(二分图HK算法)
    Codeforces Fox And Dinner(最大流)
    zoj 3367 Counterfeit Money(dp)
    ZOJ3370. Radio Waves(2-sat)
  • 原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13165807.html
Copyright © 2011-2022 走看看