第十二课 异常 讲课老师:风陨老师
2021/4/19
一,错误与异常
错误:是指代码不符合解释器或者编译器的语法
异常:是指错误引起异常
注:常见的异常,Exception:普通异常
1、AttributeError:属性错误,特性引用和赋值失败时会引发属性错误
2、NameError:试图访问的变量名不存在
3、SyntaxError:语法错误,代码形式错误
4、KeyError:使用了映射中不存在的关键字(键)时引发的关键字错误
5、IndexError:索引错误,使用的索引不存在,常索引超出序列范围,什么是索引
6、TypeError:类型错误,内建操作或是函数应于在了错误类型的对象时会引发类型错误
7、ValueError:值错误,传给对象的参数类型不正确,像是给int()函数传入了字符串数据类型的参数
1、异常:
列:
print(name)
错误:NameError 试图访问的变量名不存在
os.path
错误:NameError 未导包也会导致NameError错误
#注意:异常本身属于类 错误类型可以用help查看具体的分布结构及本质
使用方法如:help('str')
2、异常结构 异常分为四大类:
(1)、SystemExit:python 退出异常
(2)、KeyboardInterrupt:键盘打断
(3)、GeneratorExit: 生成器退出
(4)、Exception: 普通异常 #重点
#重点:python的异常结构都是继承于BaseException
3、错误回溯
列: fori in in:
print(i)
#返回错误位置-详细路径,第几行,哪里措错,以及错误类型.左单击返回路径,直接跳到错误行
File "C:/Users/Administrator/PycharmProjects/untitled/namelianxiti/File-1.py", line 45
for i in in:
^
SyntaxError: invalid syntax
注:通过回溯,准确找到错误位置,因为什么错误引起的。以及错误类型,从而解决问题。
4、异常处理
(1)、基本语法:
try:
#可能会错误的代码
except:
# 捕捉到异常的处理方案
(2)、捕获未知异常
try: #可能会错误的代码
print(name)
except Exception as a: #在未知具体的错误类型时用Exception
#异常处理逻辑
print(e)
返回:name 'name' is not defined(名称“名称”未定义)
(3)、捕获具体异常
try:
print(name)
except NameError(已知异常类型)as b:#已知错误时用已知的异常类型
print(b)
返回:name 'name' is not defined(名称“名称”未定义)
(4)、捕获多种异常
try:
print(name)
except(NameError,ValueError,KeyError) as c: #可以使用多个已知异常类型,如果都不存在就报错,此时可换未知类型异常捕获方式
print(c)
返回:name 'name' is not defined(名称“名称”未定义)
小知识:
1、代码中会出现的异常都是Exception的子类
2、在捕获异常过程中,会从上到下依次对比异常,找到之后就不会再往后查找
5、进阶异常处理
try: # 预测可能会出错代码
print(name) # 会出错的代码
except Exception as a:
print(a) # 捕捉到异常的处理方案
else:
print('未发生异常') # 没有异常执行
finally: # 不管是否出现错误都会执行
print('硬核通过')
异常时返回:name 'name' is not defined(名称“名称”未定义)
硬核通过 (#不管是否出现错误都会执行)
try: # 预测可能会出错的代码
print('name') # 会出错的代码
except Exception as a:
print(a) # 捕捉到异常的处理方案
else:
print('未发生异常') # 没有异常执行
finally: # 不管是否出现错误都会执行
print('硬核通过')
没有异常时返回:name # 正常执行
未发生异常 # 没有异常时执行
硬核通过 # 不管是否出现错误都会执行
二、主动抛出异常 raise
try:
numbers = input('请输一个数:\n')
if not numbers.isdigit(): #判断输入的数不是整数就会被执行
raise Exception('提示:输入的数必须为正整数')
except Exception as a: #捕获异常
print(a)
自定义异常:
def func(): # 自定义函数
passwords = input('请输入六位数银行卡密码:\n')
if len(passwords) == 6: # 设置盘条件
print('登录成功') # 条件符合执行
else:
raise Exception('密码不符合规定') # 条件不符合时执行
while True:
try:
func()
except Exception as a:
print(a)
class MyError(Exception):
print('错误')
def func(name):
if name == 'moran':
print('帅')
else:
raise MyError('你不帅')
try:
func('s')
except MyError as e:
print(e)
三、断言 assert 在捕获异常基础增加 assert条件筛选,不满足条件市
try:
b = 4
assert b >= 5, '不满足条件' #满足条件时,不执行
#不满足条件时,执行 报错 AssertionError
except Exception as a:
print(a)
b = 4
assert b >= 5
可以设置多个断言条件
try:
b = 4
assert b < 100 '不满足条件' # 不满足条件时,执行
assert b >= 5, '不满足条件' # 满足条件时,不执行
# 不满足条件时,执行 报错 AssertionError
except Exception as a:
print(a)
# 断点 :通过选区运行Debug,观察每一步骤的具体情况,更清楚了解到bug的详情,从而解决问题
#用法:1、首先在代码行号显示区域右击鼠标 勾选,show line Numbers
#2、代码行显示区左单击你想要执行Debug的区域,选中后有红点即操作完成
#3、在代码区,右击鼠标运行Debug
#4、在控制台区域就会显示每一个步骤的详细轨迹 点击 step into My Code 执行下一步