当前位置: 首页 > article >正文

【Python系列】python打印获取异常信息

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等
    • 常用开发工具系列:常用的开发工具,IDEA,Mac,Alfred,Git,typora 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 新空间代码工作室:提供各种软件服务,承接各种毕业设计,毕业论文等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

    • 一、异常处理的重要性
    • 二、异常处理的最佳实践
      • 1. 捕获特定异常类型
      • 2. 日志记录
      • 3. 使用`finally`块
      • 4. 避免过度捕获异常
      • 5. 自定义异常类
    • 三、总结

在日常的软件开发工作中,异常处理(Exception Handling)是一个至关重要的环节。它不仅影响到程序的稳定性和健壮性,还在提高用户体验、调试问题以及防止安全漏洞方面起到了不可替代的作用。
在这里插入图片描述

一、异常处理的重要性

  1. 提升代码的健壮性
    程序在运行时常常会遇到各种不可预见的错误,例如文件未找到、网络连接超时、输入数据格式不正确等。这些错误如果不加以处理,可能会导致程序崩溃或者执行结果与预期不符。通过异常处理机制,开发者可以有效捕获并处理这些异常,使得程序在遇到错误时能够优雅地恢复或向用户展示友好的提示信息,而不是直接中断运行。

  2. 提高代码的可维护性
    使用异常处理不仅能够帮助开发者快速定位问题,还可以让代码结构更加清晰。当程序逻辑出现错误时,异常处理机制能够精准捕捉错误发生的上下文,并记录相关的调试信息,便于开发者后续查找问题根源。

  3. 增强用户体验
    程序发生错误时,用户并不关心错误的技术细节,他们更希望能得到及时反馈,并且了解程序能否恢复正常运行。通过适当的异常处理,开发者可以在程序遇到错误时给用户友好的提示信息,同时记录详细的错误日志供开发人员进行后续排查。

二、异常处理的最佳实践

在 Python 中,异常处理通常通过try-except语句来实现。具体来说,try代码块包含可能引发异常的代码,而except块则负责捕获并处理这些异常。以本文开头的代码片段为例:

try:
    return SearchResult(
        response=response,
        context_data=context_records,
        context_text=context_text,
        completion_time=time.time() - start_time,
        llm_calls=1,
        prompt_tokens=num_tokens(search_prompt, self.token_encoder),
    )
except Exception as e:
    log.exception("Exception in _map_response_single_batch")
    error_message = str(e)  # Capture the exception message
    return SearchResult(
        response=f"Error: {error_message}",  # Store the error message in the response
        context_data=context_records,
        context_text=context_text,
        completion_time=time.time() - start_time,
        llm_calls=1,
        prompt_tokens=num_tokens(search_prompt, self.token_encoder),
    )

这个代码片段展示了一个典型的异常处理流程。在try块中,程序尝试返回一个SearchResult对象,包含了响应内容、上下文数据、生成的文本等信息,并计算了完成时间等元数据。然而,程序运行过程中可能会抛出一些未预见的异常,例如网络请求失败或者内存不足。这时,except块捕获了这些异常,并通过log.exception方法记录了异常的详细信息。

为了使代码更加健壮和易于维护,我们需要遵循以下最佳实践:
在这里插入图片描述

1. 捕获特定异常类型

在上述代码中,使用了通用的Exception来捕获所有类型的异常。然而,这种做法并不推荐。最好只捕获可能会发生的特定异常类型,例如ValueErrorIOError等。这样可以避免不必要的错误掩盖,也有助于调试时快速定位问题。

示例如下:

try:
    # 可能抛出具体异常的代码
    ...
except ValueError as ve:
    log.error(f"ValueError occurred: {ve}")
except IOError as ioe:
    log.error(f"IOError occurred: {ioe}")
except Exception as e:
    log.exception("Unexpected exception occurred")

通过这种方式,可以根据异常的类型采取不同的处理措施。例如,对于IOError,可能需要重试网络请求,而对于ValueError,则可以提示用户检查输入数据格式。

2. 日志记录

异常发生时,除了给用户友好的反馈外,还需要将异常的详细信息记录到日志中。日志记录的目的是为了后续的调试和问题追踪。在 Python 中,可以使用logging模块来记录日志,特别是log.exception()方法能够记录完整的堆栈跟踪信息,便于排查问题。

3. 使用finally

在某些情况下,无论try代码块中是否发生异常,都需要执行一些清理工作。例如,文件打开后需要关闭、数据库连接需要释放等。此时可以使用finally块,确保这些清理操作总能被执行。

try:
    # 打开文件并处理数据
    file = open('data.txt', 'r')
    data = file.read()
    ...
except IOError as e:
    log.error(f"Failed to read file: {e}")
finally:
    # 确保文件总是被关闭
    file.close()

finally块中的代码会在try代码块结束后无条件执行,哪怕在try块中抛出了异常。因此,它非常适合用于资源清理和释放操作。

4. 避免过度捕获异常

尽管异常处理可以防止程序崩溃,但也要避免过度使用try-except。在开发过程中,有时过多的异常处理会使代码结构变得复杂且难以维护。尤其是如果我们捕获了所有类型的异常,可能会掩盖一些隐藏的逻辑错误。因此,最好在明确知道可能发生的错误场景下使用try-except

5. 自定义异常类

为了使异常信息更加语义化,开发者可以定义自己的异常类。通过继承 Python 的内置异常类,可以创建更具描述性的异常,并且可以添加更多的上下文信息,方便调试。

class InvalidSearchQueryError(Exception):
    """Exception raised when the search query is invalid."""
    def __init__(self, message="Search query is invalid"):
        self.message = message
        super().__init__(self.message)

在上述自定义异常类的示例中,InvalidSearchQueryError继承了 Python 的Exception类,并增加了默认的错误提示信息。当搜索查询不合法时,可以抛出此自定义异常,从而提高代码的可读性和调试效率。

三、总结

异常处理是编写健壮、稳定、可维护代码的重要组成部分。合理的异常处理不仅能帮助程序在遇到问题时优雅地恢复,还能为开发者提供宝贵的调试信息。在 Python 开发中,开发者应遵循以下原则:捕获特定的异常类型、记录详细的日志信息、在需要清理资源时使用finally块、避免过度捕获异常,并根据实际需求定义自定义异常类。

通过合理地设计和运用异常处理机制,开发者可以大幅提升程序的健壮性和用户体验,同时减少调试和维护的难度。

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img


http://www.kler.cn/news/350884.html

相关文章:

  • Nestjs请求处理顺序
  • [Linux网络编程]04-多进程/多线程并发服务器思路分析及实现(进程,信号,socket,线程...)
  • 基于NVIDIA NIM平台—生成属于自己的DIY食谱
  • Electron调用nodejs的cpp .node扩展【非安全】
  • 【解题报告】字符串排序,自定义优先级且不使用排序工具类和Comparator#面试题#算法
  • word压缩大小怎么弄?快来试试这几种压缩word方法!
  • 京东Android最全面试题及参考答案
  • PyQt 入门教程(3)基础知识 | 3.1、使用QtDesigner创建.ui文件
  • 日本AZBIL山武燃烧控制器AUR450C82310D0说明书
  • Python logging模块实现日志饶接 按照时间命名
  • Spring Cloud微服务技术选型指南
  • VMWare NAT 模式下 虚拟机上不了网原因排查
  • CSDN怎么发布收费文章
  • Android12.0进入默认Launcher前黑屏的解决办法
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-15
  • WPS访问权限不足怎么解决??具体怎么操作?
  • Pixel Art Platformer - Dungeon URP像素地牢
  • 【计算机网络 - 基础问题】每日 3 题(四十二)
  • Mac数据恢复软件快速比较:适用于Macbook的10佳恢复软件
  • Ajax是什么?
  • 经典困难难度算法题,利用优先队列其实很好解决
  • 5. Node.js Http模块
  • 2024-10-17 精神分析-回忆出梦境的方法-记录
  • 奇瑞、别克、比亚迪、长安等安卓车机安装第三方应用教程
  • OpenCV高级图形用户界面(13)选择图像中的一个矩形区域的函数selectROI()的使用
  • vue elementui table编辑表单时,弹框增加编辑明细数据