python笔记--异常处理

1.狭义的异常处理
当一次请求多个网页时,如果其中一个网页出错,那么整个程序就会终止,造成其他网页都无法完成请求。所以需要通过异常处理将可能出错的网页进行处理,以至于其他网页能被请求。

import requests
urls = ["http://wwww.baidussss.com", "http://news.baidu.com", "http://datahonor.com/404"]

def get_data(url):
    data = requests.get(url)
    return data.text

if __name__ == '__main__':
    for url in urls:
        get_data(url)

以上代码由于第一个网址就出错了,所以程序立即终止,没有请求其他网址;当错误网址在最后的时候,即使前面3个网址已经完成请求,也会因为错误网的存在而退出,不能完成任务。异常处理能够避免这种情况。以下为改进后的代码:

import requests

urls = ["http://wwww.baidussss.com", "http://news.baidu.com", "http://datahonor.com/404"]

def get_data(url):
    # 将可能会报错的语句放在try语句块内
    try:
        data = requests.get(url)
    # 将出错后的处理放在exceot语句块内
    except requests.exceptions.ConnectionError as e:
        print("请求错误, url: ", url)\
        print("错误详情", e)
        data = None
    return data

if __name__ == '__main__':
    for url in urls:
    get_data(url)

try,except语句表达的含义是,先执行 data=requests.get(url),如果成功则跳过except继续执行,否则出现预期错误时,执行except内的语句。这样避免了因为个别网页请求错误而导致整个程序崩溃。tyr, except进一步了解代码如下。

def divide(x, y):
    try:
        result = x / y
    except ZeroExceptionError:
        print("division by zero!")
    except ValueError:
        print("Value Error")
    else:
        print("result is", result)
    finally:
        print("executing finally clause!")

注:try之后可以跟多个except语句,用于捕捉不同错误,如果except之后不佳具体错误类型,默认捕捉所有错误。else子句智能出现在except之后。finally 是在所有情况下都会被执行的语句,一般用于释放文件或者资源。

通过异常处理,既能够了解错误情况,又能够使得程序继续运行。从广义上来说,任何未达预期的情况都属于异常。

2.广义的异常处理
未达预期的情况,如请求遇到状态吗是5XX,这种情况不是自己代码出了问题,而是网站服务器有问题,是得不到网页内容的,而此时程序并不会报错,一般刷新就可以解决,所以我们代码通过模拟刷新这个操作就可以解决。

import time
import requests

urls = ["http://httpstat.us/500"]

def get_data(url, num_retries=3):
    try: 
        data = requests.get(url)
        print(data.status_code)
    except requests.exceptions.ConnectionError as e:
        print("请求错误,url", url)
        print("错误详情:", e)
        data = None

    if (data!=None) and (500<=data.status_code<600):
        if(num_retries>0):
            print("服务器错误,正在重试")
            time.sleep(1)
            num_retries -= 1
            get_data(url, num_retries)
    return data

if __name__ == '__main__':
    for url in urls:
        get_data(url)

3.robot.txt略

此文为《puthon数据分析入门–从数据获取到可视化》书的学习笔记,有错之处还请指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值