错误 error:
错误是指由于逻辑或语法等导致一个程序无法正常运行的问题
异常 exception:
异常是指程序出错时标识的一种状态
当异常发生时,程序不会再向下执行,而转向调用此函数的地方待处理此错误并恢复为正常状态
作用:
用作信号,通知上层调用者有错误产生需要处理
try 语句:
try … except 语句:
语法:
try:
可能触发异常的语句
except 错误类型1 [as 变量1]:
异常处理语句1
except 错误类型2 [as 变量2]:
异常处理语句2
except (错误类型3,错误类型4):
异常处理语句3
...
except:
异常处理语句other
else:
未发生异常的语句
finally:
最终语句
说明:
as 子句是用于绑定错误对象的变量,可以省略
except 子句可以有一个或多个,至少有一个
else 子句最多只能有一个,也可以省略
finally 子句最多只能有一个,也可以省略
作用:
尝试捕获异常(接收异常通知),将程序转为正常状态并继续执行
示例:
def div_apple(n):
print("%d个苹果你想分给几个人?" % n)
s = input("请输入人数:")
# 可能触发ValueError错误进入异常
cnt = int(s)
# 可能触发ZeroDivisonError错误
result = n / cnt
print("每个人分了", result, "个苹果")
try:
div_apple(10)
print("苹果分完了!")
# except ValueError:
# print("在try内部语句中发生了值错误,已处理并转为正常状态.")
# except ZeroDivisionError:
# print("输入人数为零,分苹果失败.")
except (ValueError, ZeroDivisionError):
print("分苹果失败!")
print("程序正常退出")
try … finally 语句:
语法:
try:
可能触发异常的语句
finally:
最终语句
说明:
finally子句不可以省略
一定不存在except子句
作用:
通常用try-finally语句来做触发异常时必须要处理的事情,无论异常是否发生,finally子句都会执行
try-finally语句不会改变程序的(正常/异常状态)
示例:
# try_finally.py
def fry_egg():
print("打开天然气...")
try:
count = int(input("输入鸡蛋个数:"))
print("完成煎鸡蛋,共煎了%d个鸡蛋!" % count)
finally:
print("关闭天然气")
try:
fry_egg()
except:
print("程序出现过异常,已转为正常状态")
print("程序正常退出")
try 语句嵌套:
try嵌套是指一个try语句嵌套在另一个try语句中
示例:
try:
try:
n = int(input("输入整数:"))
except ValueError:
print("在内层try语句中出现值错误,已转为正常状态.")
else:
print("内层try语句没有出现异常.")
except:
print("外层的try语句接收到的异常通知,已处理并转为正常状态.")
else:
print("外层try语句没有出现异常.")
raise 语句:
作用:
触发一个错误,让程序进入异常状态,发送错误通知给调用者
语法:
raise 异常类型
或
raise 异常对象
或
raise # 重新触发上一次异常
示例:
# raise.py
def make_except():
print("开始")
# 故意发送一个错误通知
# raise ValueError
e = ValueError("这是故意制作的一个错误!")
raise e
print("结束")
try:
make_except()
except ValueError as e:
print(e)
print("make_except发出了ValueError类型的错误,已捕获.")
print("程序结束")
assert 语句(断言语句):
语法:
assert 真值表达式,错误数据(通常是字符串)
作用:
当真值表达式为False时,用错误数据创建一个AssertionError类型的错误raise出去
,并进入异常状态.等同于:
if 真值表达式 == False:
raise AssertionError(错误数据)
示例:
# 此示例示意assert语句的用法
def get_score():
s = int(input("输入学生成绩(0~100):"))
assert 0 <= s <= 100, "成绩超出范围!"
# 等同于:
# if (0 <= s <= 100) is False:
# raise AssertionError("成绩超出范围!")
return s
try:
score = get_score()
except ValueError:
print("用户输入的数字不能转为整数!")
except AssertionError:
print("用户输入的数字不在范围内!")
else:
print("学生成绩为:", score)
为什么要用异常处理机制:
在程序调用层数较深时,向主调函数传递错误信息需要层层return返回比较麻烦,所以用异常处理机制