首页 > 编程问答 >Python:添加异常上下文

Python:添加异常上下文

时间:2024-07-23 03:46:57浏览次数:11  
标签:python exception

假设我想提出一个异常并提供额外的处理信息;最好的做法是什么?

我想出了以下方法,但对我来说有点可疑:

def internal_function():
    raise ValueError("smelly socks!")
    
def context_function():
    try:
        internal_function()
    except Exception as e:
        e.args= e.args[:1] + ("<raise_context>",) + e.args[1:]  # raise context varies on conditions ofc
        raise e

def handler_function():
    try:
        context_function()
    except Exception as e:
        msg, context, *other = e.args 
        if context == "some_context":
            pass # handle one way
        elif context == "some other context":
            pass # handle another way
            

仅供参考,不是重复的 如何在 Python 中向异常添加上下文|| |,因为发布者想要修改消息字符串而不是添加单独的元数据。 , since there the poster wants to amend the message string rather than adding separate metadata.


虽然你的方法有效,但它不是最干净或最符合 Python 风格的方式。修改 Exception.args 属性直接被认为是不好的做法,因为它可能导致一些依赖于异常参数结构的调试器或日志记录工具出现意外行为。

以下是更符合 Python 风格的处理此问题的替代方法:

  1. 使用自定义异常:

这是最干净和最灵活的方法。通过创建一个继承自内置 Exception 类的自定义异常,你可以添加特定于你的用例的额外属性:

```python class MyContextualException(Exception): def init (self, message, context=None): super(). init (message) self.context = context

def internal_function(): raise MyContextualException("smelly socks!", context="<raise_context>")

def context_function(): try: internal_function() except MyContextualException as e: # 处理上下文 if e.context == "<some_context>": pass # 以某种方式处理 elif e.context == "<some other context>": pass # 以另一种方式处理 raise # 重新引发以供进一步处理或记录 ```

  1. 使用 raise ... from ... 语法(用于隐式上下文):

如果你不需要处理特定于上下文的逻辑,但希望提供更多关于异常原因的信息,请使用 raise ... from ... 语法。这将保留原始异常的回溯,同时提供有关其发生上下文的额外信息:

```python def internal_function(): raise ValueError("smelly socks!")

def context_function(): try: internal_function() except ValueError as e: raise RuntimeError("在 context_function 中出现问题") from e ```

在这种情况下,最终的异常消息将指示 RuntimeError 是由于 ValueError 引起的,从而提供更多上下文。

  1. 使用日志记录库(用于调试和外部上下文):

对于调试或添加不能轻松编码为异常属性的丰富上下文信息,日志记录库(如 Python 的内置 logging 模块)非常有用:

```python import logging

def internal_function(): logging.debug("即将引发 ValueError") raise ValueError("smelly socks!")

def context_function(): try: internal_function() except ValueError as e: logging.exception("在 context_function 中捕获到 ValueError") raise # 重新引发以供进一步处理 ```

此方法提供了详细的日志,其中包含异常信息以及发生异常时执行流程的上下文,这在调试或理解生产环境中出现的问题时非常有价值。

请记住,最佳方法取决于你的具体需求。自定义异常提供最大的灵活性和明确性,而 raise ... from ... 和日志记录提供了用于添加上下文的更简单方法。

标签:python,exception
From: 78779836

相关文章

  • 【视频】Python遗传算法GA优化SVR、ANFIS预测证券指数ISE数据-CSDN博客
    全文链接:https://tecdat.cn/?p=37060本文旨在通过应用多种机器学习技术,对交易所的历史数据进行深入分析和预测。我们帮助客户使用了遗传算法GA优化的支持向量回归(SVR)、自适应神经模糊推理系统(ANFIS)等方法,对数据进行了特征选择、数据预处理、模型训练与评估。实验结果表明,这些方法......
  • Python学习笔记42:游戏篇之外星人入侵(三)
    前言在之前我们已经创建好了目录,并且编写好了游戏入口的模块。今天的内容主要是讲讲需求的分析以及项目各模块的代码初步编写。在正式编写代码前,碎碎念几句。在正式编写一个项目代码之前,实际是有很多工作要做的。就项目而言,简单的定项,需求对齐,项目架构设计,实际的代码编写,......
  • Python入门知识点 5--流程控制语句
    先来分享一个pycharm使用小技巧   红色波浪线:提醒可能报错   黄色波浪线:提醒书写不规范,ctrl+alt+l去掉黄线   code--Reformatcode,就可以去掉黄线,调整代码格式1、程序三大执行流程(1)顺序执行        程序执行时,代码从上往下,从左往右执行,中间......
  • python里读写excel等数据文件的几种常用方式
    python处理数据文件第一步是要读取数据,文件类型主要包括文本文件(csv、txt等)、excel文件、数据库文件、api等。下面整理下python有哪些方式可以读取数据文件。1.python内置方法(read、readline、readlines)read():一次性读取整个文件内容。推荐使用read(size)方法,size越大......
  • python+flask计算机毕业设计鲜花坊销售平台(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着电子商务的迅猛发展,线上购物已成为人们日常生活的重要组成部分,尤其在追求生活品质与个性化的今天,传统鲜花销售行业正经历着深刻的变革......
  • python+flask计算机毕业设计快递驿站管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着电子商务的迅猛发展,快递行业迎来了前所未有的繁荣期,快递包裹量急剧增长,对快递末端配送服务提出了更高的要求。传统的快递配送模式面临......
  • python-爬虫实例(4):获取b站的章若楠的视频
    目录前言        道路千万条,安全第一条        爬虫不谨慎,亲人两行泪获取b站的章若楠的视频一、话不多说,先上代码二、爬虫四步走1.UA伪装2.获取url3.发送请求 4.获取响应数据进行解析并保存 总结前言        道路千万条,安全第一条......
  • 使用Python和Pygame创建简单的音乐播放器
    在本篇博客中,我们将探讨如何使用Python编写一个简单的音乐播放器,并通过Pygame库实现音乐的播放和控制。我们将逐步介绍代码的功能和实现原理,以便读者能够了解每个部分的作用和如何在自己的项目中应用类似的技术。介绍音乐播放器是日常生活中常见的应用程序之一,它允许我们播放......
  • python中datetime模块
    importdatetime#fromdatetimeimportdate#1.获取当前时间2024-06-0617:30:20.733408print(datetime.datetime.now())#2.获取当前日期2024-06-06today=datetime.date.today()#获取年月日print(today.year)print(today.month)print(today.day)#......
  • python——闭包与装饰器
    闭包与装饰器1.闭包 定义闭包的三要素:外部函数嵌套内部函数外部函数将内部函数返回内部函数可以访问外部函数的局部变量了解三要素之后就可以定义一个闭包了deffun1(x):#外部函数嵌套fun2deffun2():print(x)#内部函数访问外部函数的局部变量ret......