异常Exception
什么是异常?
错误是指由于逻辑或语法等导致一个程序无法正常执行的问题
错误的特点:
有些错误是无法预知的
什么时是异常:
异常是程序出错是标识的一种状态
当异常发生时,程序不会再下向执行,而转去调有此函数的地方待处理此错误并恢复为正常状态
异常的作用:
用作用信号,通知上层调用者有错误产生需要处理
try 语句的两种语法:
try_except语句
try_finally语句
try_except语句的语法:
try:
可能出发异常的语句
except 错误类型1 [as 变量名1]:
异常处理语句1
except 错误类型2 [as 变量名2]:
异常处理语句2
except 错误类型3 [as 变量名3]:
异常处理语句3
except (错误类型3,错误类型4,....) [as 变量名3, 变量名4]
异常处理语句
...
except:
异常处理语法
else:
未发生异常的语句
finally:
最终语句
作用:
尝试捕获异常,得到异常通知,将程序由异常流程转为正常流程并继续执行
说明:
as 子句是用于绑定错误对象的变量,可以省略
except子句可以有一个或多个,但至少要有一个
except:子句必须放在所有except之后
else 子句最多只能有一个,也可以省略不写
finally 子句最多只能有一个,也可以省略不写
说明2:
else 子句里的语句会在当前try中发生任何异常是被执行
finally 子句里的语句无论在异常状态还是正常状态都一定会被执行
示例
# try_except.py
def div_apple(n):#分苹果
print("现在有%d个苹果,你想分给几个人" % n)
s = input("请输入人数:")
cnt = int(s) #<<-可能触发ValueError类型的错误
result = n / cnt #<<-可能触发ZeroDivisi错误
print("每个人分了", result, '个苹果')
try:
print("开始分苹果")
div_apple(10)
print("分苹果完成")
# 第一种方法
except ValueError as valer:
print("数字输入不正确,苹果被收回")
print("错误类型是", valer)
except ZeroDivisi as err1:
print("没有人来分苹果")
print("错误类型是", err1)
#第二种方法
# except(ValueError, ZeroDivisi) as erro:
# print("数字错误不分了")
# print("错误类型是", err0)
else:
print("我是else子句里的语句当前的try语句里没有发生任何异常,
我会被调用")
finally:
print("我是finally子句里的语句,无论正常/异常都会执行")
print("程序结束")
运行结果如下:
练习
# 练习:
# 写一个函数get_score()来获取学生输入的成绩(0~100的整数)
# 如果输入出现异常,则此函数返回0,否则返回用户胡输入的成绩
def get_score():
s = input("请输入成绩(0~100):")
try:
score = int(s)
except ValueError:
print("输入不对啊 ")
return 0
if 0 <= score <= 100:
return score
return 0 #如果这个数不再0~100之间
try:
score = get_score()
except ValueError:
print("输入有错误")
score = 0
print("学生成绩的是", score )
运行结果如下:
try_finally语句
语法:
try:
可能触发异常的语句
finally:
最终语句
说明:
finally子句不可以省略
一定不存在except 子句
作用:
通常用try_finally语句来做触发异常时必要处理的事情,无论异常是否发生,finally子句都被执行。
注意:try_finally语句不会改变程序的正常/异常状态
示例:
# try_finally.py
#此示例以控制天然气为例,执行比如要关闭的动作
def try_egg():
print("打开天然气,点燃...")
try:
count = int(input("请输入鸡蛋的个数:"))
print("完全煎鸡蛋,共煎好", count, '个鸡蛋')
finally:
print("关闭天然气")
try:
try_egg()
except ValueError:
print("煎蛋过程中发生错误,程序已转为正常状态")
print("程序结束")
运行结果如下:
try语句的嵌套
示例见
# try_finally_embed.py
#try语句的嵌套
#此示例以控制天然气为例,执行比如要关闭的动作
def try_egg():
try:
print("打开天然气,点燃...")
try:
count = int(input("请输入鸡蛋的个数:"))
print("完全煎鸡蛋,共煎好", count, '个鸡蛋')
finally:
print("关闭天然气")
except ValueError:
print("煎蛋过程中发生错误,程序已转为正常状态")
try_egg()
print("程序结束")