开发者

Python中异常链(Exception Chaining)的使用

目录
  • 基本概念
    • 隐式异常链
  • 显式异常链(使用from)
    • 禁用异常链
      • 访问异常链
        • 实际应用场景
          • 1.转换异常类型
          • 2.添加上下文信息
          • 3.屏蔽底层细节
        • 最佳实践

          基本概念

          python中有两种异常链。

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

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

          隐式异常链

          代码示例:

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

          输出会显示

          Traceback (most rehttp://www.devze.comcent call last):
            File "D:\PythonProject\Learn_250816\except_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:\PythonProject\Learn_250816\except_chain.py", line 6, in <module>
              raise ValueError("处理除零错误时出错")
          ValueError: 处理除零错误时出错
          

          显式异常链(使用from)

          代码示例:

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

          输出会显示

          Traceback (most recent call last):
            File "D:\PythonProject\Learn_250816\except_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:\PythonProject\Learn_250816\except_chain.py", line 12, in <module>
              raise ValueError("新错误") from original_error
          ValueError: 新错误
          

          禁用异常链

          使用from None可以禁用异常链

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

          输出只显示新异常

          Traceback (mosEunZhWLt recent call last):
            File "D:\PythonProject\Learn_250816\except_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.转换异常类型

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

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

          2.添加上下文信息

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

          3.屏蔽底层细节

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

          最佳实践

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

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

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

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

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

          0

          上一篇:

          下一篇:

          精彩评论

          暂无评论...
          验证码 换一张
          取 消

          最新开发

          开发排行榜