一、异常简介
Python最强大的结构之一就是它的异常处理能力,所有的标准异常都使用类来实现,都是基类Exception的成员,都从基类Exception继承,而且都在exceptions模块中定义。Python自动将所有异常名称放在内建命名空间中,所以程序不必导入exceptions模块即可使用异常。一旦引发而且没有捕捉SystemExit异常,程序执行就会终止。
异常的处理过程、如何引发或抛出异常及如何构建自己的异常类都是需要深入理解的。
二、详细介绍
1、什么是异常
简单来说,就是程序在执行过程中发生错误。
不管是通过Python解释器执行还是标准的脚本执行,所有的错误都符合相似的格式, 这提供了一个一致的错误接口。所有错误,无论是语意上的还是逻辑上的,都是由于和Python解释器不相容导致的,其后果就是引发异常。
程序在运行时,如果 Python 解释器
遇到 到一个错误,会停止程序的执行,并且提示一些错误信息,这就是 异常
2、抛出异常
程序停止执行并且提示错误信息 这个动作,我们通常称之为:抛出(raise)异常
如果不抛异常,当发生错误时,整个程序可能全部终止。抛异常可以实现让当次执行的程序中断
报出的异常类型珂参考https://blog.csdn.net/niedongri/article/details/79309136
三、捕获异常
1、简单捕获异常
在程序开发中,如果 对某些代码的执行不能确定是否正确,可以增加 try(尝试)
来 捕获异常
捕获异常最简单的语法格式:
try:
尝试执行的代码
except:
出现错误的处理
简单练习:要求用户输入数字,否则报错
try:
num = int(input('请输入一个数字:'))
print('输入正确')
except:
print('请输入数字')
运行结果:
C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exe E:/Project/爬虫阶段/day-04-26/test.py
请输入一个数字:e
请输入数字
2、抛出异常完整语法:
try—finally的方式是finally单独和try连用。这个try-finally语句和try-except区别在于它不是用来捕捉异常的。作为替代,它常常用来维持一致的行为,无论 try中是否有异常触发,finally 代码段都会被执行。
else:只有在没有异常时才会执行
try:
# 尝试执行的代码
pass
except 错误类型1:
# 针对错误类型1,对应的代码处理
pass
except 错误类型2:
# 针对错误类型2,对应的代码处理
pass
except (错误类型3, 错误类型4):
# 针对错误类型3 和 4,对应的代码处理
pass
except Exception as result:
# 打印错误信息
print(result)
else:
# 没有异常才会执行的代码
pass
finally:
# 无论是否有异常,都会执行的代码
print("无论是否有异常,都会执行的代码")
例如:
try:
num = int(input('请输入一个数字:'))
print('输入正确')
except:
print('请输入数字')
else:
print('没有异常执行顺利')
finally:
print('程序执行完毕')
有异常的运行结果:
C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exe E:/Project/爬虫阶段/day-04-26/test.py
请输入一个数字:1
输入正确
没有异常执行顺利
程序执行完毕
无异常的运行结果:
请输入一个数字:ert
请输入数字
程序执行完毕
3、自定义或主动抛出异常
在开发中,除了 代码执行出错 Python
解释器会 抛出 异常之外
还可以根据 应用程序 特有的业务需求 主动抛出异常
基本语法;
主动抛出异常终止程序
raise 异常名称(‘异常描述’)
try:
raise IndexError('索引越界')
except IndexError as e :
print(e)
执行结果:
索引越界
4.异常的好处
(1)保证程序的健壮性 代码经得起各种情况的摧残
(2)对于有问题的数据进行收集,做好留痕工作
5.爬虫过程中经常出现的异常
requests中存在的异常在:requests.exceptions
(1)requests.exceptions.ConnectionError 未知服务器
(2)requests.exceptions.ConnectTimeout 连接\读取超时
(3)requests.exceptions.ProxyError 代理服务器异常 代理连接不上
import requests
from requests.exceptions import ConnectionError
url_list=[
'htttp://www.langlang2017.com',
'http://www.xxx.com/000000000.html',
'http://www.baidu.com',
]
for url in url_list:
try:
response=requests.get(url)
print('--------:',url)
except ConnectionError as e:
print(url,'有问题')
print('ConnectionError:\n',e)
except Exception as e:
print(e)
运行结果: