Python中异常链(ExceptionChaining)的使用

Written by

in

文章目录
  • Python中有两种异常链。 1、隐式异常链:当在except块中引发新异常时自动创建 2、显式异常链:使用raise … from …语法显式创建
  • 代码示例: try: 1 / 0 except ZeroDivisionError as original_error: raise ValueError(“新错误”) from original_error 输出会显示 Traceback (most recent call last): File “D:PythonProjectLearn_250816except_chain.py”, line 10, in <module> 1 / 0 ~~^~~ ZeroDivisionError: division by zero The above exception was the direct cause of the following exception: Traceback (most recent call last): File “D:PythonProjectLearn_250816except_chain.py”, line 12, in <module> raise ValueError(“新错误”) from original_error ValueError: 新错误
  • 使用from None可以禁用异常链 try: 1 / 0 except ZeroDivisionError: raise ValueError(“新错误”) from None 输出只显示新异常 Traceback (most recent call last): File “D:PythonProjectLearn_250816except_chain.py”, line 17, in <module> raise ValueError(“新错误”) from None ValueError: 新错误
  • 可以通过异常的__cause__和__context__属性访问异常链: 1、cause: 显式使用from设置的异常 2、context: 隐式关联的异常测试代码1: try: try: 1 / 0 except ZeroDivisionError as e: raise ValueError(“新错误”) from e except ValueError as ve: print(f”当前异常: {ve}”) print(f”显式原因: {ve.__cause__}”) print(f”隐式上下文: {ve.__context__}”) 输出显示1: 当前异常: 新错误 显式原因: division by zero 隐式上下文: division by zero 示例代码2: try: try: 1 / 0 except ZeroDivisionError as e: raise ValueError(“新错误”) except ValueError as ve: print(f”当前异常: {ve}”) print(f”显式原因: {ve.__cause__}”) print(f”隐式上下文: {ve.__context__}”) 输出显示2: 当前异常: 新错误 显式原因: None 隐式上下文: division by zero
  • 1、使用raise … from …明确表达异常之间的关系 2、在需要屏蔽底层实现细节时使用from None 3、为自定义异常提供清晰的错误信息 4、在日志中记录完整的异常链信息 到此这篇关于Python中异常链(Exception Chaining)的使用的文章就介绍到这了,更多相关Python 异常链内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: Python实现抓取页面上链接的简单爬虫分享 Python调用C/C++动态链接库的方法详解 使用python实现链表操作 Python提取网页中超链接的方法 使用Python生成url短链接的方法 python单链表实现代码实例 Python实现的数据结构与算法之链表详解 Python学习入门之区块链详解
  • 目录
    • 基本概念
      • 隐式异常链
    • 显式异常链(使用from)
      • 禁用异常链
        • 访问异常链
          • 实际应用场景
            • 1.转换异常类型
            • 2.添加上下文信息
            • 3.屏蔽底层细节
          • 最佳实践

            Python中有两种异常链。

            1、隐式异常链:当在except块中引发新异常时自动创建

            2、显式异常链:使用raise … from …语法显式创建

            代码示例:

            try:
                # 可能引发异常的代码
                1 / 0
            except ZeroDivisionError:
                # 在处理过程中又引发了新异常(主动抛出新异常)
                raise ValueError("处理除零错误时出错")
            

            输出会显示

            Traceback (most recent call last):
              File "D:PythonProjectLearn_250816except_chain.py", line 3, in <module>
                1 / 0
                ~~^~~
            ZeroDivisionError: division by zero
            
            During handling of the above exception, another exception occurred:
            
            Traceback (most recent call last):
              File "D:PythonProjectLearn_250816except_chain.py", line 6, in <module>
                raise ValueError("处理除零错误时出错")
            ValueError: 处理除零错误时出错
            

            代码示例:

            try:
                1 / 0
            except ZeroDivisionError as original_error:
                raise ValueError("新错误") from original_error
            

            输出会显示

            Traceback (most recent call last):
              File "D:PythonProjectLearn_250816except_chain.py", line 10, in <module>
                1 / 0
                ~~^~~
            ZeroDivisionError: division by zero
            
            The above exception was the direct cause of the following exception:
            
            Traceback (most recent call last):
              File "D:PythonProjectLearn_250816except_chain.py", line 12, in <module>
                raise ValueError("新错误") from original_error
            ValueError: 新错误
            

            使用from None可以禁用异常链

            try:
                1 / 0
            except ZeroDivisionError:
                raise ValueError("新错误") from None
            

            输出只显示新异常

            Traceback (most recent call last):
              File "D:PythonProjectLearn_250816except_chain.py", line 17, in <module>
                raise ValueError("新错误") from None
            ValueError: 新错误
            

            可以通过异常的__cause__和__context__属性访问异常链:

            1、cause: 显式使用from设置的异常

            2、context: 隐式关联的异常
            测试代码1:

            try:
                try:
                    1 / 0
                except ZeroDivisionError as e:
                    raise ValueError("新错误") from e
            except ValueError as ve:
                print(f"当前异常: {ve}")
                print(f"显式原因: {ve.__cause__}")
                print(f"隐式上下文: {ve.__context__}")
            

            输出显示1:

            当前异常: 新错误
            显式原因: division by zero
            隐式上下文: division by zero
            

            示例代码2:

            try:
                try:
                    1 / 0
                except ZeroDivisionError as e:
                    raise ValueError("新错误")
            except ValueError as ve:
                print(f"当前异常: {ve}")
                print(f"显式原因: {ve.__cause__}")
                print(f"隐式上下文: {ve.__context__}")
            

            输出显示2:

            当前异常: 新错误
            显式原因: None
            隐式上下文: division by zero
            

            将底层异常转换为更高级别的异常

            try:
                config = load_config()
            except FileNotFoundError as e:
                raise ConfigurationError("配置文件缺失") from e
            

            try:
                process_data(data)
            except ProcessingError as e:
                raise ProcessingError(f"处理ID为{data.id}的记录时出错") from e
            

            try:
                connect_to_database()
            except DatabaseError:
                raise ServiceUnavailableError("服务暂时不可用") from None
            

            1、使用raise … from …明确表达异常之间的关系

            2、在需要屏蔽底层实现细节时使用from None

            3、为自定义异常提供清晰的错误信息

            4、在日志中记录完整的异常链信息

            到此这篇关于Python中异常链(Exception Chaining)的使用的文章就介绍到这了,更多相关Python 异常链内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

            您可能感兴趣的文章:

            • Python实现抓取页面上链接的简单爬虫分享
            • Python调用C/C++动态链接库的方法详解
            • 使用python实现链表操作
            • Python提取网页中超链接的方法
            • 使用Python生成url短链接的方法
            • python单链表实现代码实例
            • Python实现的数据结构与算法之链表详解
            • Python学习入门之区块链详解

            站内搜索