1、异常
1.1 概念引入
什么是错误: # 会引起程序的异常
错误是由于逻辑或者语法等导致一个程序无法正常执行的问题
-------------------------------------------------------------------------
什么是异常: # 错误发生时的一种状态
异常是指程序出错时标识的一种状态
当异常发生时,程序不会在向下执行,而转去调用此函数的地方待处理错误并恢复正常状态
1.2 作用
用作信号,通知上层调用者有错误产生需要处理
在程序调用层数较空时,想主调函数传递错误信息需要层层return返回比较麻烦,用异常处理机制就相对简单很多,代码量大大减少。
2、处理异常语句 try-except 语句
2.1 try语句的两种用法
try-except 语句
try-finally语句
2.2 try-except 语法
try:
可能触发的异常
except 错误类型1 [as 变量1]:
异常处理语句1
except 错误类型2 [as 变量2]:
异常处理语句2
except (错误类型3,错误类型4):
异常处理语句3
....
except:
其他异常处理语句
else:
未发生错误执行的语句 , 发生错误不执行
finally:
最终语句 , 无论正常还是异常都一定会执行
2.3 作用
尝试捕获异常(接受异常通知),将程序转为正常状态并继续执行
2.4 说明
as 子句用于绑定错误对象的变量,可以省略 eg :except ValueError as err
except 子句可以有一个或多个,但至少有一个
else 子句最多只能有一个,但也可以省略不 # 只有在try语句内部没错误的时候执行,有错误不执行
finally 子句最多只能有一个,但也可以省略不写 # finally语句无论怎么样都一定会执行
2.5 示例1
def div_apple(n):
print("%d个苹果你想分给几个人?"%n)
s = input('请输入人数:')
cnt = int(s) # 可能触发 ValueError 错误进入异常
result= n/cnt # 可能触发 ZeroDivisionError错误进入异常
print("每个人分了",result,"个苹果")
try:
div_apple(10)
print("苹果分配完成!")
except ValueError:
print("在try语句内部发生了值错误,已处理并转为正常状态!")
except ZeroDivisionError:
print("不能分配给0个人!")
print("程序正常退出")
示例2:
# 捕获异常,数输入1~100的数并输出,捕获:超出范围或者类型错误,返回 0
# 也可以在函数外捕获异常
def get_score():
try:
num = int(input("请输入一个数:"))
if 0<=num<=100:
return num
else:return 0
except ValueError:
return 0
score = get_score()
print(score)
3、处理异常语句 try-except语句
3.1 语法:
try :
可能触发异常的语句
finally:
最终语句
3.2 说明:
finally子句不可以省略
一定不存在except子句
3.3 作用:
通常用try-finally 语句来做触发异常时必须要处理的事情,无论异常是否发生,finally字句都会执行
try-finally语句不会更改程序的(正常/异常状态)
3.4 示例:
def fry_egg():
print("打开天然气...")
try:
count = int(input("请输入煎几个鸡蛋:"))
print("完成煎鸡蛋,共煎了%d个鸡蛋"%count)
finally:
print("关闭天然气...")
try:
fry_egg()
except:
print("程序出现异常,已转为正常状态")
print("程序正常退出")
4、try 语句嵌套示例
4.1 定义:try语句嵌套是指一个try语句嵌套在另一个try语句内使用
4.2 示例1
x = 100
y = 200
try:
save_x = x
save_y = y
try:
print('x = {},y = {}'.format(x,y))
x = int(input("x="))
y = int(input("y="))
print("打印x y,打印完成后x,y恢复原值")
print('’x = {},y = {}'.format(x,y))
finally:
x = save_x
y = save_y
finally:
pass
print('x = {},y = {}'.format(x,y))
4.3 示例2
# 此示例示意try语句嵌套,在内层的try语句如果已经把状态转为正常状态,则外层的try语句将收不到错误通知
try:
try:
n = int(input("请输入整数:"))
except ValueError:
print("在内层try出现值错误,已转为正常状态")
else:
print("内层try没有出现异常")
except:
print("外层的try语句接到异常通知,已处理并转为正常状态")
else:
print("外层的try语句没有出现异常")
5、raise语句
5.1 作用:
触发一个错误,让程序进入异常状态
发送错误通知给调用者
5.2 语法:
raise 异常类型
或
raise 异常对象
或
raise #重新出发上一次异常
5.3 示例1:
def make_except():
print("开始")
try:
raise ValueError # 故意发送一个错误通知
except:
print("接到异常通知,已处理并转为正常状态")
print("调用结束")
try:
make_except()
except:
print("接到异常通知,已处理并转为正常状态")
print("程序结束")
5.4 示例2
def make_except():
print("开始")
e = ValueError("这是一个故意制作的异常")
raise e
print("结束")
try:
make_except()
except ValueError as err:
print("接到异常通知,已处理并转为正常状态")
# 获取错误的原因
print(err)
print("程序结束")
5.5 示例3
# 写一个get_age()函数用来获取一个人的年龄信息
# 此函数规定与欧诺个户只能输入1~140之间的整数,如果输入其他则直接出发ValueError错误类型来通知调用者
def get_age():
age = int(input("请输入年龄(1~140):"))
if age >140 or age <1:
raise ValueError("用户输入的不是1~140范围内的数字,获取年龄失败!")
else:
return age
def main():
try:
age = get_age()
print("用户输入的年龄是:",age)
except ValueError as err:
print("发生错误的类型为:",err)
main()
6、assert 语句(断言语句)
6.1 语法:
assert 真值表达式,错误数据(通常是字符串)
6.2 作用:
当真值表达式为Flase时,用错误数据创建一个AssertionError类型的错误raise出去,并进入异常状态
等同于:
if 真值表达式 == Flase:
raise AssertionError
6.3 示例:
# 此示例示意assert语句的用法
def get_score():
s = int(input("请输入学生成绩(1~100):"))
assert 0<=s<=100,'成绩超出范围!'
return s
try:
score = get_score()
print("学生的成绩为:",score)
except ValueError:
print("输入数据类型有误!")
except AssertionError:
print("用户输入的整数不在0~100之间!")