1. 异常的作用
异常通常就是我们说的程序报错
当异常被抛出(触发)之后,后面的代码就不会再运行
异常处理的作用:尽量让程序正常运行,尽早发现问题
list = [1,2,3]
print(list[4]) # 索引超出范围,会报错
print('continue...') # 此行代码不会执行
运行结果:
2. 异常的类型
-- ImportError:无法引入模块或包
-- IndexError:下标索引超出序列边界
-- NameError:使用一个还未赋予对象的变量
-- SyntaxError:代码逻辑语法出错,不能执行,不能去捕获
-- TypeError:传入的对象类型与要求不符
-- ValueError:传入一个不被期望的值,即使类型正确
-- KeyError:试图访问你字典里不存在的键
-- IoError:输入输出异常
2.1 NameError
age = -1
if age > 18:
name = 'yuz'
elif age > 0:
name = 'v'
print(name) # 没有符合条件,所以不执行,所以name没有定义
运行结果:
在写代码过程中,经常会出现此错误,一定要注意变量要先定义再使用
2.2 SyntaxError
age = -1
if age > 18 # 缺少:导致报错
name = 'yuz'
elif age > 0:
name = 'v'
print(name)
运行结果:
语法错误是容易出现的,多注意一下语法格式,就不会出现此类错误
2.3 KeyError/ValueError
info = {'name':'zhangsan'}
print(info['age'])
运行结果:
print(int('asd'))
运行结果:
2.4 TypeError
age = input('请输入年龄')
if age >= 18:
print('成年人')
else:
print('未成年')
运行结果:
出现异常,应该如何处理:首先是分析是异常提示,不懂就百度翻译一下,点击蓝色链接可以直接跳转到出现异常的那行代码
3. 异常的捕获
3.1 捕获异常
格式:
try:
是你觉得可能会出现异常的代码
except:
出现异常时,你会进行的操作
注意:
-- 当捕获了异常,也就是执行了 except 里的内容,还会接着执行后面的代码,不会影响后面代码
-- 当 try 正常执行了,就不会执行 except 的内容
-- try 和 except 的代码,只会执行其中一个,不会同时执行,即要么有异常(执行 except 代码),要么无异常(执行 try 的代码)
a = [1, 23, 3]
index = 100
try:
value = a[100]
print('有异常吗?')
except:
print('index索引出现了问题,麻烦开发赶紧来修复!')
print('continue...')
运行结果:
index索引出现了问题,麻烦开发赶紧来修复!
continue...
分析过程:
a = [1, 23, 3]
index = 100
try:
value = a[1]
print('有异常吗?')
except:
print('index索引出现了问题,麻烦开发赶紧来修复!')
print('continue...')
运行结果:
有异常吗?
continue...
分析过程:
3.2 捕获指定异常
格式:
tyr:
是你觉得可能会出现异常的代码
except 错误类型 as 变量名:
出现异常时,你会进行的操作
a = [1, 23, 3]
index = 100
try:
value = a[18]
print('有异常吗?')
except IndexError as err: # 只能捕获IndexError异常
print(f'index索引出现了问题,麻烦开发赶紧来修复:{err}')
print('continue...')
运行结果:
index索引出现了问题,麻烦开发赶紧来修复:list index out of range
continue...
3.3 捕获任意异常
格式:
tyr:
是你觉得可能会出现异常的代码
except Excetion as 变量名:
出现异常时,你会进行的操作
a = [1, 23, 3]
index = 1
try:
value = a[index] # 这条代码成立,没异常
b = 1 / 0 # 所以执行这条代码,有异常
except Exception as err:
print(f'计算错误:{err}')
print('continue...')
运行结果:
计算错误:division by zero
continue...
注意:一次只能捕获一个异常,不会同时捕获多个异常
a = [1, 23, 3]
index = 1
try:
value = a[index]
1 / 1
print(name)
except IndexError as err:
print(f'索引超出范围:{err}')
except ZeroDivisionError as err:
print(f'计算错误:{err}')
except Exception as err:
print('万能警察')
print('continue...')
运行结果:
万能警察
continue...
再举个栗子:
判断输入的年龄是否是数字,不是数字直接捕获异常,是数字再判断是否成年人
age = input('请输入年龄')
try:
age = float(age)
if age >= 18:
print('成年人')
else:
print('未成年')
except ValueError as e:
print('输入类型错误,请输入数字')
运行结果:
请输入年龄d
输入类型错误,请输入数字
分析过程:
4. 主动抛出异常
raise(抛出的异常)
注意:遇到 raise 后,就不会执行后面的代码
def add(a, b):
if (not isinstance(a,int)) or (not isinstance(b,int)):
# 如果a或b不是整数,就抛出异常,像return一样,遇到了就不执行后面的代码
raise ValueError('a 或 b 不是整数')
c = a + b
return c
print(add('12',3))
运行结果:
5. finally
格式:
tyr:
是你觉得可能会出现异常的代码
except 异常类型 as 变量名:
出现异常时,你会进行的操作
finally:
不管异常有没有被捕获都要执行的代码
age = input('输入年龄')
try:
age = float(age)
if age >= 18:
print('成年人')
else:
print('未成年')
except ValueError as e:
print('类型不正确,请输入数字')
finally:
print('判断完成')
print('continue...')
运行结果:
不管是否异常,finally里的代码都会执行
第一次输入年龄3
输入年龄3
未成年
判断完成
continue...
第二次输入年龄aa
输入年龄aa
类型不正确,请输入数字
判断完成
continue...