异常
目标
- 了解异常
- 捕获异常
- 异常的else
- 异常finally
- 异常的传递
- 自定义异常
一 了解异常
异常就是 错误 bug
异常语句 尝试执行一些可能出现异常的代码, 当出现异常时, 自动执行事先设置好的另外的代码 ,程序就不会报错, 可以继续
二 异常的写法
2.1 语法
try:
可能发生错误的代码
except:
如果出现异常, 再执行的代码
2.2 体验
需求 :尝试以r模式打开文件,如果文件不存在就以w模式打开
即 有某文件就只读打开,没有就新建一个然后打开
# --*coding:utf-8*--
"""
需求 :尝试以**r**模式打开文件,如果文件不存在就以**w**模式打开
"""
try:
a=open("异常体验文本.txt","r")
except:
a=open("异常体验文本.txt","w")
print(a.read())
2.3 捕获指定异常类型
2.3.1 语法
try:
可能发生错误的代码
except:
如果捕捉到该异常类型后,,执行的代码
- 什么是异常类型 ? 书写了错误代码, 报错时 冒号前面的红字 NameError就是
0 不能当除数
2.3.2 体验
try:
print(abc)
except NameError:
print("名字错误")
except ZeroDivisionError:
print("除数不能为0")
try:
a=5/0
except NameError:
print("名字书写错误")
except ZeroDivisionError:
print("0不能做除数")
## 0不能做除数
注意
- 如果产生的错误代码, except 里面没有预置, 则无法捕捉异常
- 一般 try 里面只有一行 可执行 代码
2.3.3 捕获多个指定异常类型
多个异常 放 except后面的括号里面–元组形式
try:
a=1/0
except (ZeroDivisionError,NameError):
print("错误")
2.3.4 捕获异常类型 +描述信息
为什么要捕获错误信息?
因为错误信息, 可以帮助我们排查错误信息
try:
a=1/0
except (ZeroDivisionError,NameError) as 变量: #用变量 来储存捕获到的错误信息
print(变量) #没有引号
try:
a=5/0
except NameError as 变量: #用 变量 来储存捕获到的错误信息
print("名字书写错误")
print("变量",变量)
except ZeroDivisionError as 变量:
print("0不能做除数")
print("捕获到的错误信息是:",变量)
"""
## 0不能做除数
## 变量 division by zero
"""
0不能做除数
变量 division by zero
2.3.5 捕获所有异常
优点 不用预置 异常类型
如上面的 except (ZeroDivisionError,NameError ) as 变量:
try:
a=1/0
except Exception as 变量:
print("所有异常信息为:",变量)
"""
所有异常信息为: division by zero
"""
Exception 是所有程序异常类的 父类
try:
a
except Exception as 变量: #变量 存储错误信息用
print("所有异常信息为:",变量)
"""
所有异常信息为: name 'a' is not defined
"""
2.4 异常中的else
- 没有异常 ,要执行的代码 if else
# --*coding:utf-8*--
"""捕获异常"""
try:
"a"
except Exception as 变量:
print(变量)
else:
print("没有异常代码")
"""没有异常代码"""
2.5 异常中的finally
- 有没有 异常,都要执行的文件, 统称放关闭文件
# --*coding:utf-8*--
"""捕获异常"""
try:
f=open("测试异常.txt","r")
except Exception as 变量:
f=open("测试异常.txt","w")
else:
print("没有异常")
finally:
f.close()
三 异常的传递
体验异常的传递
- 需求:
1 尝试只读方式打开test.txt, 如果在就读取, 不在就提示用户
2 读取内容的要求: 尝试循环读取内容 读取过程中如果检测到用户意外终止程序, 则except捕获异常,并提出用户
# --*coding:utf-8*--
import time
""" 1 尝试只读方式打开test.txt, 如果在就读取, 不在就提示用户
2 读取内容的要求: 尝试循环读取内容 读取过程中如果检测到用户意外终止程序, 则except捕获异常,并提出用户
"""
try:
f=open("异常体验文本.txt")
# print(f.read())
# print("=============")
try:
while True:
row=f.readline()
if len(row)==0:#数据长度
break
print("row=",row,"len=",len(row))
time.sleep(1) # 给用户干预 留出时间
except:
#如何文件执行中,有异常,那么except 会捕捉到
# 执行中 按 □,停止程序
print("用户意外终止")
finally:
f.close()
print("关闭txt文件")
except:
print("txt文件异常")
四 自定义异常 raise
将不满足程序逻辑要求的代码, 捕获异常,抛出raise 异常类对象
抛出错误, 不是语法错误, 是不符合逻辑的, 不符合用户要求的错误
[需求] 密码长度不足, 则报异常 ,抛出自定义异常,并捕获该异常
[老的写法 print方式]
[作用] 帮助我们报错, 类型是不满足程序逻辑的错误
while True:
p = input("请设置您的密码:")
if len(p)>=5:
print(f"你的密码是{p},请牢记")
break
print("密码不足5位,重新输入")
代码
# --*coding:utf-8*--
"""
[需求]
密度长度不足,则报错,抛出自定义异常,并捕捉该异常
[步骤]
# 先自定义异常类,继承Exception(系统自带的异常类)
# 抛出异常
# 捕获异常
"""
# 自定义异常
class ShortInputError(Exception): #Exception 系统默认异常
def __init__(self,length,min_len):
self.length=length #用户输入的字母长度
self.min_len=min_len # 系统要求的最小长度
# 设置抛出自定义异常描述信息
def __str__(self):
return f"你输入的密码{self.length},不足{self.min_len}"
#
def main():
# 3 抛出异常:尝试执行 用户输入密码,如果长度小于5 ,抛出异常
try:
con=input("请你输入您的密码")
if len(con)<5:
# 抛出异常类创建的对象,并传入实参
raise ShortInputError(len(con),5) #抛出异常对象,并传入2个真实数据
# 4 捕获该异常
except Exception as result:
print(result)
# 5 没有异常时 打印
else:
print("没有异常,密码完成输入")
main()
"""
请你输入您的密码1
你输入的密码1,不足5
"""
五 总结
异常的作用
在书写代码是难免出现错误,为了代码运行时 不被错误中断,这个时候,我们可以把 这个可能出现错误的代码 放到try except里面执行
-
异常语法
try: 可能发生异常的代码 except: 如果出现异常 ,那么就执行 这行代码 else: 没有异常 ,执行的代码 finally: 无论有没有异常都要执行的代码
-
捕获异常
except 异常类型: # 指定异常类型,两个用元组括号 代码 except 异常类型 as xx: # 捕获异常的描述信息 代码
-
自定义异常
# 1 自定义异常**类** class 异常类类名(Excepion): 代码 # 设置抛出异常的 描述信息 def __str__(self): return ...# 编辑描述异常信息 # 2 抛出异常 raise 异常类名() #可传参数 # 3 捕捉异常 except Exception....