错误处理,异常机制
理想的书籍是智慧的钥匙 –列夫.托尔斯泰
异常的概念
有的时候我们在程序运行阶段会发生各种错误,无法在编码阶段预知它们是否会发生.但是我们可以提前预知一下 在代码中对潜在错误做出处理,以避免对程序运行造成破坏性的影响
异常的捕获
try-except 异常捕获
- 异常的捕获可以使用 try-except 语句
try:
代码块1
except:
代码块2
执行顺序是,从 try 下的代码块 1 开始执行,若其中有异常抛出,那么异常将会被捕获,直接跳转并执行 except 下面的代码块 2 若代码块 1 一切正常,并没有异常抛出,那么代码块 2 将不会被执行
也就是代码块 1 是我们正常运行的代码,而代码块 2 则是当发生错误时用于处理错误的代码
来看一个使用 try-except 的例子
try:
fruit = ['apple','banana']
print(fruit[2])
except:
print("列表索引越界了")
捕获指定的异常
之前我们没有直接指定要捕获的异常类型,所以所有类型的异常都会被捕获
我们也可以显式的指定要捕获的异常种类
try:
代码块1
except 异常x as e:
代码块2
和第一个区别的就是多出了异常 x as e 这一部分。异常 X 是指定要捕获的异常名,比如 NameError,indexError 等等 as e 语句是将异常对象赋予变量 e.这样 e 就可以在代码块 2 中使用了,如获取错误信息
- 捕获指定异常得例子
try:
arr = ['apple','banana']
print(arr[2])
except IndexError as e:
print('出现越界得错误',e)
这里我们显式得指定要捕获 IndexError 异常,并且将异常中的错误信息输出信息
显式指定异常时,只有被指定的异常会被捕获,其余异常会被忽略
try:
代码块1
except(异常x,异常y,异常z) as e :
代码块2
try-except-finally
在之前介绍的 try-except 之后还可以跟 finally 语句
try:
代码块1
except 异常x as e:
代码块2
finally:
代码块3
它得执行流程是
首先执行代码块 1
若发生异常则执行代码块 2,否则跳过代码块 2
无论是否发生异常都执行代码块 3
也就是在 try-except 得基础上,紧接着执行 finally 下的代码块,且 finally 下的代码必定执行
finally 有什么用 .举个例子 我们有时会在 try 下使用一些资源,比如(文件,网络链接),而无论过程中是否有异常我们都需要释放掉这些资源,这时可以将释放资源得代码放到 finally 语句下
- 常见得异常类型
异常名 | 含义 |
---|---|
Exception | 大多数异常得基类 |
SyntaxErroe | 无效语法 |
NameError | 名字(变量,函数,类等) 不存在 |
raise 主动抛出异常
- 主动抛出异常用 raise 语句
raise ValueError()
# 或者可以指明原因
raise ValueError('输入值不符合要求')
- 举例
def age_life(age):
if age<0:
raise ValueError("年龄不符合")