1. 了解异常
- 定义 程序出现错误
- 作用 通过异常处理,使得出现错误的程序能够继续的执行下去,而不是直接中断
2. 异常写法
2.1 语法
try:
可能异常的语句
except:
如果出现异常执行的语句
- 代码解释
打开一个文件,如果文件不存在,以 r 打开会报错,则以 w 模式打开
try:
f = open('haha.txt', 'r')
except:
f = open('haha.txt', 'w')
2.2 捕获指定异常
- 语法
try:
可能异常代码
except 异常类型:
出现错误时执行的语句
try
中语句一般只为一句
如果指定的异常类型 和 出现的异常 不一致,无法捕获,会报错
- 代码解释
try:
# print(1/0) # ZeroDivisionError
print(num)
except NameError:
print('有错误')
2.3 捕获多个异常
try:
print(num)
except (ZeroDivisionError,NameError): # 将多个异常类型同时放一个元祖中
print('有错误')
2.4 捕获异常的描述信息
try:
print(num)
except (ZeroDivisionError,NameError) as result: # 将捕获的异常信息放入result中
print(result)
2.5 捕获全部异常
Exception
是所有错误类型的父类
try:
print(num)
except Exception as result:
print(result)
2.6 异常的else 和 finally
如果try没有错误,则继续执行else中命令
如果有错误,则不执行
不管有没有异常都会执行 finally 中语句
try:
f = open('haha.txt', 'r')
except:
f = open('haha.txt', 'w')
else:
print('haha,no worry!') # 如果没有异常,则执行
finally:
f.close() # 最后都会关闭文件
3. 异常传递
通过嵌套try语句,由外向内传递异常,先执行外部try
- 读取文件,如果存在则读取,否则输出异常
- 读取内容时:如果检测到程序被终止,则输出异常
import time
try:
f = open('hello.txt')
try:
while True:
con = f.readline() # 不断读取文件内容
if len(con) == 0:
break
time.sleep(3) # 程序休眠3秒
print(con)
except:
# 通过Ctrl+c 主动终止程序
print('程序被意外终止了!')
except Exception as result:
print()
else:
f.close()
4. 自定义异常
- 用途:当某些错误不属于语法错误,而是需求逻辑上的错误,需要自定义异常,如密码长度
- 语法:
- 先自定义一个类,继承
Exception
类,通过__str__
特殊方法返回错误信息 - 然后在
try
中如果出现错误则通过raise
抛出自定义的异常类
- 先自定义一个类,继承
- 代码解释
# 1. 自定义一个异常类
class Password_len_detect(Exception):
def __init__(self,plen,min_len):
self.length = plen
self.min_len = min_len
#2. 设置抛出异常的描述信息
def __str__(self):
return f'输入密码长度为{self.length},密码最小长度要求{self.min_len}'
def main():
try:
password = input('请输出密码:')
length = len(password)
# 3. 通过 raise 调用自定义的异常类
if length < 3:
raise Password_len_detect(length,3)
# 4. 最后通过Exception捕获语法异常
except Exception as result:
print(result)
else:
print('密码设置成功!')
main()
5. 总结
- 基本异常
try:
except:
else:
finally:
- 捕获异常及描述信息
except (多个异常元祖) as result:
print(result)
except Exception as result:
print(result)
- 异常传递
try:
try:
except:
except:
- 自定义异常
1. 自定义错误类
class 自定义类(Exception):
...
2. 返回错误信息
def __str__(self):
return 错误信息
try:
3. 出现错误信息抛出自定义错误类
raise 自定义错误类
4. 最后通过Exception捕获语法异常
except Exception as result:
print(result)