当检测到错误时,解释器无法继续执行了,反而出现了一些错误提示,就是异常
异常的语法
try:
可能发生错误的代码
except:
如果出现异常执行的代码
try:
f = open("test.txt","r")
except:
f = open("test.txt","w")
捕获异常
捕获指定异常
try:
1/0
except ZeroDivisionError:
print("除数为0") # 除数为0
捕获多个指定异常
当捕获多个异常时,可以把要捕获异常类型的名字,放到except后,并使用元组的方式书写
try:
1/0
except (NameError,ZeroDivisionError):
print("有错误") # 除数为0
捕获所有异常
Exception是所有有程序异常类的父类
try:
1/0
except Exception as result:
print(result) # division by zero
捕获异常描述信息
try:
1/0
except ZeroDivisionError as result:
print(result) # division by zero
异常的else
else表示没有异常要执行的代码
try:
print(1)
except Exception as result:
print(result)
else:
print("没有异常,执行else") # 1\n没有异常,执行else
异常的finally
finally表示的是无论是否异常都要执行的代码,如关闭文件
try:
f = open("test.txt","r")
except:
f = open("test.txt","w")
finally:
f.close()
抛出异常
raise 可以抛出异常,直接退出多重循环
自定义异常
在Python中,抛出自定义异常语法未raise 异常类对象
class ShortInputError(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():
try:
con = input("请输入密码:")
if len(con)<=6:
raise ShortInputError(len(con),6)
except Exception as result:
print(result)
else:
print("密码输入通过")
main() # 请输入密码:test\n你输入的密码长度是4,密码不能小于6个字符
异常的短路
try中有异常时,异常语句后的代码都不会执行
有多个except时,如果异常被前面的except捕获了,那么后面的except就被短路了,不会执行了
try:
1/0
print(1)
except ZeroDivisionError:
print("除数为0")
except:
print("有错误了") # 除数为0
异常的传递
import time
try:
f = open("test.txt")
try:
while True:
content = f.readline()
if len(content) == 0:
break
time.sleep(2)
print(content)
except:
print("程序被意外终止")
except:
print("该文件不存在")
异常的嵌套
try:
try:
1/0
except ZeroDivisionError:
print("除数为0")
1 + "a"
except TypeError:
print("类型错误") # 除数为0\n类型错误