一、前言
在我们写代码的过程中,不管是有意无意,经常会出现代码在运行过程中出现报错的情况,这时候就会影响到我们代码的正常运行,运行过程被打断,这在实际项目中是不能够被允许的,所以我们就要用到异常,来帮助我们来规避此类的错误。
二、异常的使用
1、基本格式和操作
Python中的异常基本格式为
try:
可能会发生异常的代码
except 异常类(可选):
异常发生时,跳转到这里执行的代码
except 异常类(可选):
异常发生时,跳转到这里执行的代码
else:
没有异常发生时,执行这里的代码
我们将可能会发生错误的代码放在try中间,当出现异常时,代码不会继续执行,而是跳转到except中,执行里面的代码,我们在里面设置一些补救的措施,或者是提示信息之类的
a = [1, 2, 3]
try:
print(a[3]) # 因为队列只有三个元素,所以在执行a[3]时会报错
print('this is test') # 当上面语句报错时,就不会再继续执行下面的代码,也就不会打印‘this is test’
# 存在多个except时,先执行到哪个except,那么其他的except都不会再被执行
except BaseException:
print('Error') # 当抛出符合条件的异常时,代码会直接跳转到这里,会打印‘Error’
except:
print('Another Error') # 当抛出符合条件的异常时,代码会直接跳转到这里,会打印‘Another Error’
else:
print('Normal') # 当没有异常时,else里面的代码会执行
结果: Error
2、try-finally的使用
如果我们不确定哪些代码在什么时候会抛出异常,但是有些语句必须要执行的话,那我们可以使用finally,finally后面的语句,是不管try里面的代码是否会发生异常,都会去跳转执行的,我们仍然以刚才代码为例
a = [1, 2, 3]
try:
print(a[3]) # 抛出异常
print('this is test') # 由于上面语句异常,所以此行不会执行
except BaseException:
print('Error') # 当抛出符合条件的异常时,代码会直接跳转到这里,会打印‘Error’
except:
print('Another Error') # 当抛出符合条件的异常时,代码会直接跳转到这里,会打印‘Another Error’
else:
print('Normal') # 由于抛出异常,所以不会执行此行
finally:
print('End') # finally中语句,不管有没有异常,都会执行
结果: Error
End
# 我们再来看没有异常的情况
a = [1, 2, 3]
try:
print(a[2]) # 取值正常,不会异常
print('this is test') # 由于上面代码正常,所以此行正常执行
except BaseException:
print('Error')
except:
print('Another Error')
else:
print('Normal') # 由于没有抛出异常,所以此行会执行
finally:
print('End') # finally中语句,不管有没有异常,都会执行
结果: 3
this is test
Normal
End
三、异常类
我们说到,在except中可以输出我们想要执行的代码,比如我们刚才打印的一个Error;但有时候我们想要追根溯源,想要知道导致异常的原因是什么,这个时候我们就可以用不同的异常类来捕获,最常用的异常类是BaseException,他基本可以抓取到所有可能的异常,他的使用方法如下:
a = [1, 2, 3]
try:
print(a[3]) # 抛出异常
print('this is test')
except BaseException as e:
print(e) # 捕获到了异常,并打印出异常原因,e是我这里自定义的,大家也可以定义别的值
print('Error')
finally:
print('End')
结果: list index out of range
Error
End
可以看到,我们可以打印出异常的原因,是由于队列超出范围导致。
当然,除了BaseException之外,我们还可以抓取一些指定的异常,比如AttributeError是对象没有这个属性错误,IOError是输入输出操作失败等等,这里不做赘述,大家有兴趣的话可以自行度娘,BaseException基本就可以覆盖大部分使用场景了,反正我是喜欢用,哈哈哈哈哈
四、自定义类
如果官方提供的异常类都无法满足你的需求的话,那我们也可以自己定义异常类
# 我们自定义一个Networkerror类,父类为RuntimeError,这个类就输出一个Networkerror字符串
class Networkerror(RuntimeError):
def __init__(self):
print(“Networkerror”)
try:
raise Networkerror() # raise是语法异常的方法,我们可以手动触发异常
except Networkerror as e:
print(e) # 触发异常后打印Networkerror内的__init__内容
finally:
print('End')
结果: Networkerror
End
五、总结
以上就是异常的基本使用了,是不是很简单,会了这些,就不怕你的代码运行运行着,飞了。。。
接下来的三章,我们给大家介绍一些对于初学者来说稍微一丢丢的高级,但又是我们经常用的部分,分别是正则表达式,socket通信以及多进程、多线程的使用,学完了这些,我相信大家已经可以应付一些初级的代码研发工作了