异常处理
在解释异常处理前先了解一下什么是错误:
¥¥错误是指由于逻辑或语法导致一个程序无法正常执行的问题
再来说说什么是异常以及该怎么解决:
什么是异常:
异常是值程序出错时标识的一种状态
当异常发生时,程序不会再向下执行,而转去调用此函数的地方处理此函数并恢复到正常状态
异常的作用是什么呢?
异常是一种信号,来通知上层调用者有错误产生需要处理
语法:
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:
最终语句
try-except的作用:
尝试捕获异常(接收异常通知),将程序转为正常状态并继续执行
语法说明:
as 子句是用于绑定错误对象的变量,可以省略
except 子句可以有一个或多个,但至少要有一个
else 子句最多只能有一个,也可以省略
finally 子句最多只能有一个,也可以省略
异常实例讲解:
def div_apple(n):
print('%d个苹果您想分给几个人?' % n)
s = input('请输入人数:')
cnt = int(s) # <<-- 可能触发异常ValueError错误进入异常
result = n / cnt # <<-- 可能触发ZeroDivsionError错误进入异常
print('每个人分了', result, '个苹果')
try: # 正常执行
div_apple(10)
print('分苹果完成')
#-------------模块一:except 错误类型,捕获异常类型---------------------------
# except ValueError: # 只有在有异常时才会执行
# print('在try的内部语句中发生了值错误,已处理并转为正常状态')
# except ZeroDivisionError:
# print('输入人数为0,分苹果失败')
#-------------------------------------------------------------------------
#---模块二:except(错误类型1,错误类型2):满足这两个错误类型都执行这个函数------
# except (ValueError, ZeroDivisionError):
# print('苹果不分了')
#--------------------------------------------------------------------------
#--模块三:except:除了捕获的之外,不管什么异常都执行此函数----------------------
# except ValueError: # 只有在有异常时才会执行
# print('在try的内部语句中发生了值错误,已处理并转为正常状态')
# except:
# print('收到除ValueError之外的错误通知')
#---------------------------------------------------------------------------
#--模块四:as 变量: 将捕获的错误信息用变量绑定----------------------------------
# as 的用法
# except ValueError as err:
# print('错误的值是:', err) # invalid literal for int() with base 10: 'aaa'
# 10个苹果您想分给几个人?
# 请输入人数: aaa
# 错误的值是: invalid literal for int() with base 10: 'aaa'
# 程序正常退出
#---------------------------------------------------------------------------
#--模块五:else的用法,只有在try是没有异常的时候才会执行--------------------------
# except ValueError:
# print('苹果不分了')
# else: # 只有在try没有发生错误时才会执行
# print('在当前try语句内部,没有发生任何异常,程序正常执行')
#----------------------------------------------------------------------------
#--模块六:finally的用法,不管try有没有错误,其下的语句块都会执行------------------
# finally字句的用法
except ValueError:
print('苹果不分了')
except: # 除ValueError异常外的异常
print('错误值是:0' )
else: # 如果没有异常才执行
print('else子句被执行了')
finally: # 不管有没有异常都会执行的语句
print('finally子句被执行了')
print('程序正常退出')
#-----------------------------------------------------------------------------
一个练习:
写一个函数,get_score() 来获取学生输入的成绩(0-100的整数)输入如果出现异常,则让此函数返回0,否则返回用户输入的成绩
def get_score():
...
score = get_score()
print('学生的成绩是:', score)
注:try-except语句也可以放在函数的内部使用
# 方法一
def get_score():
try:
score = int(input('输入成绩: '))
except ValueError:
return 0
if score in range(101):
return score
else:
return 0
score = get_score()
print('学生的成绩是:', score)
# 方法二
def get_score():
score = int(input('输入成绩: '))
if score in range(101):
return score
else:
return 0
try:
score = get_score()
except ValueError:
score = 0
print('学生的成绩是:', score)
raise 语句:
作用:
触发一个错误,让程序进入异常状态
发送错误通知给程序调用者
语法:
raise 异常类型
或
raise 异常对象
或
raise # 重新触发上一次异常
def get_age():
age = int(input('请输入年龄(1-140):'))
if age in range(1, 141):
return age
raise ValueError # 故意抛出异常
try:
age = get_age()
print('用户输入的年龄是:', age)
except ValueError as err: # 接收抛出的异常
print('用户输入的年龄不在1-140之间,获取年龄失败!')
assert 语句(断言语句)
语法:
assert 真值表达式,错误数据(通常是字符串)
作用:
当真值表达式为False时,用错误数据创建一个AssertionError类型的错误raise出去,并进入异常状态
等同于:
if 真值表达式 == False:
raise AssertionError(错误数据)