当前位置:   article > 正文

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

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

执行结果 :

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在这里插入图片描述


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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

执行结果 :

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/631649
推荐阅读
相关标签
  

闽ICP备14008679号