文章目录
- 一、Python 异常传递
- 1、异常传递性
- 2、代码示例 - 异常传递性
- 3、代码示例 - 在指定位置处理异常
一、Python 异常传递
1、异常传递性
在 Python 中 , 异常是具有传递性的 , 该特性是 Python 中的一个重要特性 , 它使得代码更加健壮和可靠 ;
异常传递 指的是 在代码中捕获一个异常 , 并在另一个地方处理它的过程 ;
异常处理顺序 : Python 中的异常处理顺序是按照 从内向外的顺序 进行的 , 如果一个异常 没有被内层的 try 块捕获 , 那么它将会被 传递到外层的 try 块 中 , 如果 最终没有 try 块能够处理这个异常 , 那么程序将会终止 , 并显示一个错误信息 ;
异常传递 : 如果 在 try 块中抛出了一个指定类型的异常 , 程序会立即跳回到最内层的 except 块中寻找能够处理这个异常的代码 ;
- 如果找到了相应的 except 块 , 那么 该块将会处理这个异常 ;
- 如果没有找到相应的 except 块 , 异常将会被传递到外层的 try 块中 ;
该过程会一直持续 , 直到找到能够处理该异常的代码 或者 程序终止 ;
异常重抛 : 在 except 块中处理异常时 , 可以 将异常重新抛出 ; 这表示 当前代码不处理该异常 , 需要将其传递给上层的代码进行处理 ; 使用 raise 语句并指定相同的异常类型和错误信息 , 重新抛出异常 ;
异常处理多层嵌套 : 异常处理操作是可以嵌套多层的 , 该机制使得代码 以更加灵活地处理异常 , 并且可以在不同的层次中处理不同类型的异常 ;
2、代码示例 - 异常传递性
在 函数 A 中 执行会产生异常的代码 , 如 1 / 0
, 会抛出一个 ZeroDivisionError 异常 ;
在 函数 B 中调用 函数 A , 在 函数 C 中调用 函数 B ;
函数 A 会将 ZeroDivisionError 异常 抛出给 函数 B , 函数 B 如果没有处理该异常 , 则会将异常抛出给 函数 C ;
此时可以在 函数 C 中 , 捕获 ZeroDivisionError 异常 , 并进行处理 ;
代码示例 :
"""
异常传递 代码示例
"""
def funA():
print("funA 执行开始")
num = 1 / 0
print("funA 执行结束")
def funB():
print("funB 执行开始")
funA()
print("funB 执行结束")
def funC():
print("funC 执行开始")
funB()
print("funC 执行结束")
funC()
执行结果 :
D:\001_Develop\022_Python\Python39\python.exe D:/002_Project/011_Python/HelloPython/Hello.py
Traceback (most recent call last):
File "D:\002_Project\011_Python\HelloPython\Hello.py", line 24, in <module>
funC()
File "D:\002_Project\011_Python\HelloPython\Hello.py", line 20, in funC
funB()
File "D:\002_Project\011_Python\HelloPython\Hello.py", line 14, in funB
funA()
File "D:\002_Project\011_Python\HelloPython\Hello.py", line 8, in funA
num = 1 / 0
ZeroDivisionError: division by zero
funC 执行开始
funB 执行开始
funA 执行开始
Process finished with exit code 1
3、代码示例 - 在指定位置处理异常
在上个章节的代码中 , ZeroDivisionError 异常 是按照下面的顺序进行传递的 :
funA() 函数 -> funB() 函数 -> funC() 函数
可以在 上述 3 个函数中的 任意一个位置 , 捕获异常 , 并处理异常 ;
代码示例 :
"""
异常传递 代码示例
"""
def funA():
print("funA 执行开始")
num = 1 / 0
print("funA 执行结束")
def funB():
print("funB 执行开始")
funA()
print("funB 执行结束")
def funC():
print("funC 执行开始")
try:
funB()
except Exception as e:
print(f"捕获到了异常 {e}")
print("funC 执行结束")
funC()
执行结果 :
D:\001_Develop\022_Python\Python39\python.exe D:/002_Project/011_Python/HelloPython/Hello.py
funC 执行开始
funB 执行开始
funA 执行开始
捕获到了异常 division by zero
funC 执行结束
Process finished with exit code 0