【Python】异常处理 ⑤ ( 异常传递 | 异常处理顺序 | 代码示例 )





一、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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/han1202012/article/details/131378810