python 中捕获异常的基本用法:
# try 语句是正常执行的代码
try:
# 打开文件(读取中文数据时需要指定 encoding 参数)
fd = open("a.txt", "r", encoding="UTF-8")
try:
# 循环一行一行读取文件
while True:
line = fd.readline()
# 如果读取结束,退出循环
if (len(line) == 0):
break
# 输出读取的数据
print(line, end="")
# 如果在读取文件过程中发生了异常,就会跳入 except 代码块
# Exception 是所有异常类的基类,Exception as ret 表示为 Exception 类实例化一个对象 ret,
# ret 对象中就保存了异常的信息;
except Exception as ret:
print("读取文件失败,失败原因:", ret)
# 没有发生异常时执行的代码块;如果发生了异常,则不会执行
else:
print("读取文件成功")
finally:
# 不管有没有异常,都会执行 finally 语句
fd.close()
print("关闭文件")
# except 语句后面也可以不用加异常类
except:
print("文件不存在")
异常的传递:
# 定义一个函数,在该函数中会产生异常
def test1():
print(num) # num 未定义,会产生异常
# 在 test2 中调用 test1,由于 test1 产生了异常,会传递到 test2,
# 而 test2 并没有对异常进行捕获,所以该异常会继续向上传递给 python
# 解析器,最终由 python 解析器报出该异常;
def test2():
test1()
# 在 test3 中调用 test1,test1 中产生的异常会传递给 test3,但是
# test3 中进行了异常的捕获,所以异常在此处被处理,不会再继续向上
# 传递给 python 解析器了;
def test3():
try:
test1()
except Exception as ret:
print("捕获到了异常:", ret)
# 调用 test3 函数,捕获 test1 的异常
test3()
print("=====================")
# 调用 test2 函数,没有不会 test1 的异常
test2()
输出结果:
自定义异常类:
# 自定义异常类,继承 Exception:Exception 是所有异常类的基类;
class ShortInputException(Exception):
# 初始化对象属性
def __init__(self, length, atleast):
self.length = length
self.atleast = atleast
# 设置输出对象时,输出自定义异常类的异常信息
def __str__(self):
return "Input message length must not be less than 3"
try:
# 接收用户输入信息
s = input("请输入:")
if len(s) < 3:
# 用 raise 关键字引发一个自定义的异常类
raise ShortInputException(len(s), 3)
# 如果捕获到了我们自定义的异常类,则进行处理
# ShortInputException as ret 表示为 ShortInputException 异常类实例化一个对象 ret,
# 输出对象 ret 时,就会输出自定义异常类的异常信息
except ShortInputException as ret:
print("ShortInputException 异常,输入的长度是 %d,长度至少应是 %d" %(ret.length, ret.atleast))
print("ShortInputException 异常:", ret)
else:
print("没有发生异常")
raise 单独使用,表示不处理异常,直接将异常向下传递,比如:
# 自己处理异常
try:
n = 1 / 0 # 抛出 ZeroDivisionError 异常
except ZeroDivisionError:
print("产生了 ZeroDivisionError 异常") # 自己处理异常
# 自己不处理异常
try:
print(num) # 抛出 NameError 异常
except NameError:
raise # 不处理异常,直接将异常向下传递(交给 python 解析器处理)