异常 exception
什么是错误
错误是指由于逻辑或语法等导致一个程序无法正常执行的问题
什么是异常
异常是程序出错时标识的一种状态
当异常发生时,程序不会再向下执行,而转去调用此函数的地方待处理此错误并恢复为正常状态
作用:
用作信号,通知上层调用者有错误产生需要处理
try语句的两种法
try-except语句
try-finally语句
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 子句最多只能有一个,也可以省略不写
示例:
try:
n = int(input("请输入整数:"))
except int: # 错误,int类型不能当成错误类型用于try-except语句中
pass
try-finally语句
语法:
try:
可能触发异常的语句
finally:
最终语句
说明:
finally 子句不可以省略
一定不存在except子句
作用:
通常用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语句如果已经把状态转为正常状态
# 则外层的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
raise ZeroDivisionError
print("结束")
try:
make_except()
except ValueError as err:
print("make_except 发出了ValueError类型的错误,已捕获")
# 错误的原因如何获得?
print("错误的值是:", err)
print("程序结束")
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 真值表达式, 错误数据(通常是字符串)
作用:
当真值表达式为False时,用错误数据创建一个AssertionError类型的错误raise出去,并进入异常状态
等同于:
if 真值表达式 == False:
raise AssertionError(错误数据)
示例:
class A:
v = 100
def __init__(self):
self.v = 200
a1 = A()
a2 = A()
del a2.v
print(A.v)
print(a1.v)
print(a2.v)
print(a1.__class__.v)
为什么要用异常处理机制
在程序调用层数较深时,向主调函数传递错误信息需要层层return 返回比较麻烦,所以用异常处理机制
示例:
def f1():
print("开始盖房子打地基...")
# err = ValueError("打地基挖出古物,停止施工")
# return err
print("地基完成")
def f2():
print("开始盖房子地面以上部分....")
err = ValueError("要建高压线...停止施工")
return err
print("地面以上部分完工")
def f3():
'''第一承包商开始找人盖房子'''
r = f1()
if r is not None:
return r
r = f2()
if r is not None:
return r
def build_house():
'''第一承包商开始找人盖房子'''
r = f3()
if r is not None:
return r
r = build_house()
if r is not None:
print("出错:", r)
课后习题:
1. 一个球从100米高空落下,每次落地后反弹高度是原高度的一半,再落下
写程序算出皮球在第10次落地后反弹高度是多高?
打印出共经过了多少米的路程
2. 分解质因数: 输入一个正整数,分解质因数:
如输入:
90
则打印:
'90=2*3*3*5'
(质因数是指小数最小能被原数整除的素数(不包含1))
3. 修改原学生信息管理程序,加入异常处理语句,让程序在任何情况下都能按逻辑正常执行
如: 输入成绩和年龄时,如果用户输入非法空符串也不会导致程序崩溃
想要看更多的课程请微信关注SkrEric的编程课堂

100

被折叠的 条评论
为什么被折叠?



