-
异常 exception
什么是错误
错误是指由于逻辑或语法等导致一个程序无法正常执行的问题
什么是异常
异常是程序出错时标识的一种状态
当异常发生时,程序不会再向下执行,而转去调用此函数的地方待处理此错误并恢复为正常状态
作用:
用作信号,通知上层调用者有错误产生需要处理
try语句的两种用法:
try-except语句
try-finally语句
try-except语法:
try:
可能触发异常的语法
except 错误类型1[as 变量1]:
异常处理语句1
except 错误类型2[as 变量2]:
异常处理语句2
except 错误类型3[错误类型3,错误类型4]:
异常处理语句3
....
except:
异常处理语句 other
else:
未发生异常语句
finally:
最终语句
示例:
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,ZeroDivisionError) as err:
print("错误的值是:",err) #err绑定错误对象
else: #只有在try没有错误时才会执行
print("在当强前try语句的内部没有发生任何异常,程序走正常流程")
finally:
#finally 子句的语句无论是正常流程还是异常流程都会被执行
print("我这条语句一定会执行")
print('程序正常退出')
语法说明:
as 子句是用于绑定错误对象的变量,可以省略
except 子句可以有一个或多个,但至少要有一个
else 子句最多只能有一个,也可以省略不写
finally 子句最多只能有一个,可以省略
作用:
尝试捕获异常(接受异常通知),将程序转为正常状态并继续执行
示例:
练习:
写一个函数 get_score()来获取学生输入成绩(0-100的整数)
输入如果出现异常,则让此函数返回0,否则返回用户输入的成
注:
try_except语句也可以放在函数内部使用
def get_score():
s = int(input("请输入整数(0~100):"))
if s > 100 or s <0:
return 0
else:
return s
#方法1,在调用的地方加入异常处理语句,然后进行处理
try:
score = get_score()
except ValueError:
score = 0
print("在try的内部语句中发生了值错误,已处理并转为正常状态")
print("此学生的成绩是:",score)
方法2,在函数内部有可能抛出异常的地方加上try-except语句
def get_score():
try:
s = int(input("请输入整数(0~100):"))
except ValueError:
return 0
print("在try的内部语句中发生了值错误,已处理并转为正常状态")
if s > 100 or s <0:
return 0
else:
return s
score = get_score()
print("此学生的成绩是:",score)
-
try-finally语句
语法:
try:
可能触发异常的语句
finally:
最终语句
说明:
finally子句不可以省略
一定不存在ecxept子句
作用:
通常用try-finally语句来左触发异常时必须要处理的事情,无论异常是否发生,finally子句都会
被执行,try-finally语句不会改变程序的(正常/异常状态)
示例:
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 #重新触发上一次异常
示例:
def make_except():
print("开始")
# raise ValueError #故意发送一个错误通知
e = ValueError("这是一个故意制作的错误")
raise e
print("结束")
try:
make_except()
except ValueError as err: #err绑定ValueError
print("make_except 发出了ValueError类型的错误,已捕获")
#错误的原因如何获得
print("错误的值是:",err)
print("程序结束")
练习:
写一个函数get_age()用来获取一个人的年龄信息
此函数规定用户只能输入1-140之间的整数,如果用户输入其他的数则直接触发ValueError类型的错误来通知调用者
def get_age():
a = int(input("请输入一个整数(1-140之间):"))
if a > 140 or a < 1:
raise ValueError
return a
try:
age = get_age()
print("用户输入的年龄是:",age)
except ValueError as err:
print("用户输入的不是1-140的整数,获取年龄失败!")
-
assert语句(断言语句)
语法:
assert 真值表达式,错误数据(通常是字符串)
作用:
当真值表达式为False时,用错误数据创建一个AssertiionError类型
的错误raise出去,并进入异常状态
等同于:
if 真值表达式 == False:
raise AssertionError (错误数据)
示例:
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之间...")
异常(高级)
- with 语句
语法:
with 表达式1[as 变量1],表达式2[as 变量2],......
语句块
作用:
使用于对资源进行访问的场合,确保使用过程中不管是否发生异常都会执行必须的'清理'操作,并释放资源
如:
文件打开后自动关闭,线程中锁的自动获取和释放等()
说明:
as子句中的变量用于绑定表达式执行后生成的对象,with语句并不会改变异常的状态
示例:
# with.py
#用try_finally来保证文件一定能正常关闭
try:
f = open('../../第五周笔记/python基础-20.txt')
try:
for l in f:
print(l)
finally:
f.close()
print('文件已经关闭')
except OSError:
print('打开文件失败')
#用with语句保证文件一定能够关闭
try:
with open('../../第五周笔记/python基础-20.txt') as f:
for l in f:
x = int('aaa') #当进入异常时,打开的文件也能够关闭
print(l)
except OSError:
print('打开文件失败')
环境资源管理器:
1.类内有__erter__和__exit__实例方法的类的创建的对象被称为环境管理器
2.能够用with语句进行管理的对象必须是环境管理器
3.__enter__方法将在进入with语句时被调用由as变量绑定返回的对象
4.__exit__方法将在离开with语句时被自动调用,且可以通过参数来判断离开with语句是否有异常发生
示例:
class A:
'''此类对象可以用于with语句进行管理'''
def __enter__(self):
print('此方法实在with语句内')
return self #self 将被with中的as变量绑定
def __exit__(self,exc_type,exc_val,exc_tb):
'''exc_type用来绑定错误类型,当没有发生异常时绑定None
exc_val用来绑定错误对象,当没有发生异常时绑定None
exc_tb用来绑定TraceBack追踪,当没有发生异常时绑定None'''
if exc_type is None:
print('您已离开with语句,离开时没有任何异常')
else:
print('您已离开with语句')
print('错误类型是:',exc_type)
print('错误对象是:',exc_val)
print('Traceback',exc_tb)
with A() as a:
print('这是with语句内部的输出')
int(input('请输入整数:'))
print('程序正常结束')
-
为什么要用异常处理机制
在程序调用层数较空时,向主调函数传递错误信息需要层层return
返回比较麻烦,所以用异常处理机制