什么是错误呢?
错误是指由于逻辑或语法等导致一个程序无法正常执行的问题。
什么是异常呢?
异常是程序出错时标识的一种状态。
当异常发生时,程序不会再向下执行,而转去调用此函数的地方待处理此错误并恢复为正常状态。
作用:
用作信号,通知上层调用者有错误产生需要处理。
以下介绍四种关于异常处理的语句
为什么要用异常处理机制呢?
在程序调用层数较深时,向主调函数传递错误信息需要层层return 返回比较麻烦,所以用异常处理机制。
一.try-except语句
语法:
try:
可能触发异常的语法
except 错误类型1 [as 变量1]:
异常处理语句1
except 错误类型2 [as 变量2]:
异常处理语句2
except (错误类型3,错误类型4):
异常处理语句3
....
示例代码如下:
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('输入人数为零,分苹果失败!')
print("程序正常退出")
作用:
尝试捕获异常(接收异常通知),将程序转为正常状态并继续执行。
语法说明:
as 子句是用于绑定错误对象的变量,可以省略。
except 子句可以有一个或多个,但至少要有一个。
二.try-finally语句
语法:
try:
可能触发异常的语句
finally:
最终语句
示例代码如下:
def fry_egg():
print("打开天燃气...")
try:
count = int(input("请输入鸡蛋个数: "))
print("完成煎鸡蛋,共煎了%d个鸡蛋!" % count)
finally:
print('关闭天燃气')
try:
fry_egg()
except:
print("程序出现过异常,已转为正常状态")
print("程序正常退出")
作用:
通常用try-finally语句来做触发异常时必须要处理的事情,无论异常是否发生,finally子句都会被执行try-finally 语句不会改变程序的(正常/异常状态)。
说明:
finally 子句不可以省略,一定不存在except子句。
三.raise语句
语句:
raise 异常类型
或
raise 异常对象
或
raise # 重新触发上一次异常
示例代码如下:
def make_except():
print("开始_make_except")
raise ValueError("我的一个值错误!")
print("结束....")
def get_except():
try:
make_except()
except ValueError as err:
print("错误的值是:", err)
raise # 重新触发刚收到的错误 等同于raise err
try:
get_except()
except ValueError as err:
print("get_except内部发生值错误!", err)
print("程序结束")
作用:
触发一个错误,让程序进入异常状态,发送错误通知给调用者。
四.assert 语句(断言语句)
语法:
assert 真值表达式, 错误数据(通常是字符串)
示例代码如下:
# 此示例示意assert语句的用法
def get_score():
s = int(input("请输入学生成绩(0~100):"))
assert 0 <= s <= 100, '成绩超出范围!!!'
# 等同于:
# if (0 <= s <= 100) == False:
# raise AssertionError('成绩超出范围!!!')
return s
try:
score = get_score()
print("学生成绩为:", score)
except ValueError:
print("用户输入数字不能转为整数...")
except AssertionError:
print("用户输入的整数不在0~100之间...")
作用:
当真值表达式为False时,用错误数据创建一个AssertionError类型的错误raise出去,并进入异常状态。
马行软地易失蹄,人贪安逸易失志!