目录
1 异常与错误
- 错误:指的是代码有语法问题,无法解释运行,必须改正过后才能运行。
- 异常:代码语法没有问题,但是运行时会出现错误,这种在运行期间检测到的错误被称为异常。Python支持coder自己检测处理异常。
2 try-except语句
2.1 语法1(异常的基础写法,不推荐)
try:
可能发生异常的代码
except:
如果出现异常执行的代码
注意:使用
except
而不带任何异常类型,这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息,因为它捕获所有的异常。
2.2 语法2(返回异常的原因,捕获指定异常)
try:
可能发生异常的代码
except 异常类型1(Exception) as 变量名: # Exception是任何异常类型
出现异常1后执行的代码
except 异常类型2(Exception) as 变量名: # Exception是任何异常类型
出现异常2后执行的代码
......
注意:使用多个
except
代码块时,必须坚持对其规范排序,要从最具针对性的异常到最通用的异常。
- 工作流程:
- 首先,执行
try子句
,即可能出现异常的代码 - 如果
try子句
没有异常,则不执行except子句
,try子句执行完后结束。 - 如果
try子句
执行过程中出现异常,try子句
剩下的部分被忽略。如果异常的类型和except
后的异常类型相同,则对应的except子句
被执行,其他的except子句
则被忽略。 - 如果没有一个异常和任何
except子句
匹配,则异常传递给上层的try中。
- 首先,执行
【例子】
try:
a = int(input('请输入除数(分母):'))
b = int(input('请输入被除数(分子):'))
print(b/a)
print('异常检测出来后,继续执行的代码')
except ZeroDivisionError as error:
print('执行错误\n原因是:'+str(error))
except ValueError as error:
print('执行错误\n原因是:'+str(error))
'''
请输入除数(分母):0
请输入被除数(分子):9
执行错误
原因是:division by zero
-------------------------
请输入除数(分母):a
执行错误
原因是:invalid literal for int() with base 10: 'a'
'''
注意:如果try子句执行过程中出现异常,那么try子句后面的代码不会再执行。
2.3 语法3(捕获多个异常)
try:
可能发生异常的代码
except (异常类型1,异常类型2,...) as 变量名:
捕获其中一个异常类型后执行的代码
注意:如果不是指定的异常类型还是会报错。
【例子】
try:
a = int(input('请输入除数(分母):'))
b = int(input('请输入被除数(分子):'))
print(b/a)
print('异常检测出来后,继续执行的代码')
except (ZeroDivisionError,ValueError) as error:
print('执行错误\n原因是:'+str(error))
'''
请输入除数(分母):a
执行错误
原因是:invalid literal for int() with base 10: 'a'
'''
3 try-except-else语句
- 语法:
else
表示当try子句
执行没有异常时,将被执行的语句。
try:
检测范围
except 异常类型 as 变量名:
出现异常后的处理代码
else:
如果没有异常执行这块代码
【例子】
try:
a = int(input('请输入除数(分母):'))
b = int(input('请输入被除数(分子):'))
print(b/a)
except (ZeroDivisionError,ValueError) as error:
print('执行错误\n原因是:'+str(error))
else:
print('没有异常,正确执行')
'''
请输入除数(分母):2
请输入被除数(分子):4
2.0
没有异常,正确执行
'''
4 try-except-finally语句
- 语法:finally表示无论
try子句
是否异常都要执行的代码。
try:
检测范围
except 异常类型 as 变量名:
出现异常后的处理代码
finally:
无论如何都会被执行的代码
【例子】
try:
a = int(input('请输入除数(分母):'))
b = int(input('请输入被除数(分子):'))
print(b/a)
except (ZeroDivisionError,ValueError) as error:
print('执行错误\n原因是:'+str(error))
else:
print('没有异常,正确执行')
finally:
print('无论如何都会执行我')
'''
请输入除数(分母):0
请输入被除数(分子):2
执行错误
原因是:division by zero
无论如何都会执行我
'''
5 自定义异常:raise语句
- 作用:将不满足程序逻辑的情况,反馈给用户,不是语法的错误。比如输入密码不符合要求,至少不能低于8位,要求大小写等。
- 【例子1:自己定义/抛出异常并捕获】
try:
a=102
if a>100:
raise Exception('数值大于100')
except Exception as error:
print(error,type(error))
# 数值大于100 <class 'Exception'>
6 习题
- Q1:猜数字游戏
电脑产生一个零到100之间的随机数字,然后让用户来猜,如果用户猜的数字比这个数字大,提示太大,否则提示太小,当用户正好猜中电脑会提示,“恭喜你猜到了这个数是…”。在用户每次猜测之前程序会输出用户是第几次猜测,如果用户输入的根本不是一个数字,程序会告诉用户"输入无效"。
A1:
import random
true_num=random.randint(0,100)
print('猜测一个0-100之间的整数')
try:
for i in range(1,101):
print(f'第{i}次猜,',end='')
user_num=int(input('请输入一个整型数字:'))
if user_num > true_num:
print('太大')
if user_num < true_num:
print('太小')
if user_num == true_num:
print(f'恭喜你猜到了这个数是{true_num}')
except ValueError:
print('输入无效')
'''
猜测一个0-100之间的整数
第1次猜,请输入一个整型数字:50
恭喜你猜到了这个数是50
--------------------------------
猜测一个0-100之间的整数
第1次猜,请输入一个整型数字:a
输入无效
'''