错误:错误是指由于逻辑或语法等导致一个程序无法正常执行的问题
特点:有些错误时无法预知的
异常:
异常时程序出错时标识的一种状态
当异常发生时,程序不会再向下执行,而转去调用此函数的地方待 处理此错误并恢复为正常状态
异常的作用:
(1)通知上层调用者有错误产生需要处理
(2)用作信号
try语句的两种语法:
try-except语句语法:
try:
可能触发异常的语句
except 错误类型1 [as 变量1]:
异常处理语句2
except 错误类型2 [as 变量2]:
异常处理语句3
.....
except:
异常处理其他所有的错误类型
else:
未发生异常时执行的语句
finally:
最终执行语句
作用:尝试捕获正常,将程序转为正常状态并继续执行
示例:
#分苹果并分析其中的异常并处理
def div_apple(n):
print('%d个苹果您想分给几个人?'%n)
s = input('请输入人数:')
cnt = int(s) #可能触发ValueError错误异常
result =n/cnt #可能触发ZeroDivisionError错误异常
print("每个人分了",result,"个苹果")
#以下时调用者并使用try语句捕获错误
try:
print("开始分苹果")
div_apple(10)
print("分苹果完成")
except ValueError as err:
print('苹果退回来部分了')
print('错误信息是:',err)
print("程序正常退出")
语法:
try:
可能触发异常的语句
finally:
最终语句
说明:
(1)finally子句不可以省略
(2)一定不存在except子句
作用:通常用try-finally语句来做触发异常时必须要处理的事情,无论异常是否发生,finally子句都会被执行
注:try-finally语句不会改变程序的(正常/异常)状态
手动抛出一个类型错误,给函数调用者try-except处理
通常用于程序测试中
示例:
def make_except():
print('开始测验') #还可以
raise ValueError #e = ValueError('值错误啦!')
print('结束') #raise e,但e是局部变量故except
try: #中仍要用全名
make_except()
print('make_except正确执行') #不会执行
except ValueError:
print('出现了ValueError错误,已处理被转为正常')
#print('ValueError绑定的对象是:',ValueError)
语法:assert真值表达式,错误数据(通常是字符串)
作用:当真值表达式为False时,用错误数据创建一个AssertionError类型的错误,并进入异常状态
类似于:
if 真值表达式 ==False:
raise AssertionError(错误数据)
示例:
def get_age():
a = int(input('请输入年龄:'))
assert 0<=a<=140,'年龄不在合法范围内' #若后无except AssertionError
return a #会直接出现异常并报错
try:
age = get_age()
except ValueError:
print('输入非法字符')
age = 0
except AssertionError as e:
print('错误原因是:',e)
age = 0
print('你输入的年龄是:',age)
总结:
为什么要用异常处理机制:
在程序调用层数较深时,向主调函数传递错误消息需要用return语句层层传递比较麻烦,所以用异常处理机制
例如:
#方法1
def f1():
...........
if ....:
return ValueError
else:
return 0 #0表示成功执行
def f2():
r = f1()
if r != 0
return r
............
if ....:
return ValueError
else:
return 0
def f3(): #调用f1和f2
r = f1()
if r!=0:
return r
r = f2()
if r!= 0:
return r
return 0
f3()
#方法2
def f1():
return 0
def f2():
r = f1()
return 0
def f3():
r = f1()
r = f2()
return 0
try:
f3()
except ValueError:
print('错误执行')
else:
print('正常结束')