Python 中的错误处理和日志记录

编写软件是一项远非完美的活动。从构思到生产,可能会出现错误,在某些情况下,可能会故意发生失败。这就是为什么理解主要编程语言中的错误处理和日志记录是一项需要掌握的关键技能。

错误可能会发生,情况也可能出现,但是您的应对方式(包括有关错误的准备和信息)将使您尽快摆脱困境。

在本文中,我们将学习 python 中的错误处理和日志记录。我们将主要探讨异常以及如何使用python的logging包来编写各种类型的日志。

如果您对此类主题的更多内容感兴趣,请订阅我的时事通讯以获取有关软件编程、架构和技术相关见解的定期更新。

python 中的异常

与许多其他编程语言一样,python 能够在发生错误时引发异常。在编程中,异常是在程序执行过程中发生的事件,扰乱了正常的指令流程。

立即学习“Python免费学习笔记(深入)”;

在python中,异常是在执行过程中检测到的错误。当异常发生时,python 会停止运行代码并寻找特殊的代码块(try/ except 块)来处理错误。

以下是 python 程序中可能出现的一些常见异常:

zerodivisionerror:尝试将数字除以零时发生。

filenotfounderror:尝试打开不存在的文件时发生。

valueerror:当字符串不代表数字时尝试将字符串转换为整数时发生。

indexerror: 尝试从索引不存在的列表中检索元素时发生。

还有更多的异常,如果您需要自定义行为,python 使您能够创建自己的异常。这是我们将在本文后面探讨的功能。

要处理python异常,你需要捕获它们。捕获异常需要一种称为 try/ except 的简单语法。让我们来探索一下吧。

尝试/除外

try/ except 块用于处理异常。可能引发异常的代码放在try块中,如果发生异常,则执行 except块。以下是代码块中 try/ except 的语法:

try:    # code that might raise an exception    passexcept exceptiontype as e:    # code to handle the exception    pass

可能失败的代码放在 try 块内。如果出现问题,程序的执行会进入 except 块。

这是一个流程图,说明了 try/ except 的工作原理:

Python 中的错误处理和日志记录

让我们看看如何用这种方法处理被零除的情况:

# handling division by zerotry:    result = 10 / 0except zerodivisionerror:    print("error: cannot divide by zero.")# the code will continue its execution

try/ except 语法中还有额外的块,例如 else 和 finally:

try:    # code that might raise an exception    passexcept exceptiontype as e:    # code to handle the exception    passelse:    # code to run if no exception is raised    passfinally:    # code that always runs, regardless of whether an exception was raised or not    pass

这些块是可选的,但有特定目的:

else 块(可选):包含在 try 块中没有引发异常时运行的代码。它对于只应在 try 块成功时运行的代码很有用。

finally 块(可选):包含始终运行的代码,无论是否引发异常。这通常用于清理操作,例如关闭文件或释放资源。

这是一个示例,我们在出现错误时在 finally 中处理文件的关闭:

try:    # open the file    file = open('example.txt', 'r')    # read from the file    content = file.read()    # print file content (this will only execute if no exceptions are raised)    print(content)except filenotfounderror as e:    # handle the specific exception    print(f"error: {e}")except exception as e:    # handle any other exceptions    print(f"an unexpected error occurred: {e}")else:    # code that runs if no exception was raised in the try block    print("file read successfully.")finally:    # ensure the file is closed, regardless of whether an exception was raised    try:        file.close()        print("file closed.")    except:        # handle the case where file was never opened (e.g., if open() failed)        print("file was not opened or already closed.")

免责声明: 上面的示例演示了使用 try/ except/finally 进行文件处理,以确保即使发生错误也能正确关闭文件。然而,这种方法对于日常文件操作来说并不理想。在实践中,建议在python中使用with语句进行文件处理。 with 语句自动管理文件的打开和关闭,确保文件在其套件完成后正确关闭,即使发生异常也是如此。

这就是 try/ except 的工作原理。现在,if/else 可能会有些混淆。什么时候应该使用 try/ except,什么时候应该使用 if/else?

try/ except 和 if/else 有什么区别?当您想要检查可以在导致错误之前预测和处理的条件时,请使用 if/else,并使用 try/ except 来捕获和管理代码执行期间发生的异常,特别是对于您无法轻易预见的错误。

在下面的情况下,if/else 将无法正常工作:

filename = 'non_existent_file.txt'if filename:  # this only checks if filename is not empty, not if the file exists    # the following line will raise an exception if the file doesn't exist    content = open(filename, 'r').read()  # this will crash if the file does not exist    if content:        print("file content exists:")        print(content)    else:        print("file is empty.")else:    print("filename is invalid.")

这里有一个更好的 try/ except 解决方案:

filename = 'non_existent_file.txt'try:    content = open(filename, 'r').read()    if content:        print("file content exists:")        print(content)    else:        print("file is empty.")except filenotfounderror:    print("error: file not found.")

在上面的解决方案中,代码尝试打开并读取文件,检查其内容是否存在,如果存在则打印它。如果文件不存在,它会捕获 filenotfounderror 并打印错误消息,防止程序崩溃。

正如本文前面提到的,python 允许自定义异常。让我们来了解更多吧。

在 python 中创建自定义异常

在python中,您可以定义自己的异常,以更精细的方式处理特定的错误情况。自定义异常在复杂的应用程序中特别有用,例如金融科技,您可能需要强制执行业务规则或以独特的方式处理特定的错误情况。

例如,在金融科技应用程序中,您可能会遇到根据某些条件检查钱包余额的场景。如果钱包余额不足或不符合特定规则,您可能需要提出例外。以下是为此目的创建和使用自定义异常的方法:

# define a custom exceptionclass walletbalanceerror(exception):    def __init__(self, message):        self.message = message        super().__init__(self.message)# function that checks wallet balancedef check_wallet_balance(wallet_balance, required_balance):    if wallet_balance < required_balance:        # raise the custom exception with a specific message        raise walletbalanceerror(f"insufficient balance: wallet balance of {wallet_balance} is less than the required {required_balance}.")# example usagetry:    # example wallet balance and required balance    wallet_balance = 50    required_balance = 100    # check if the wallet balance is sufficient    check_wallet_balance(wallet_balance, required_balance)except walletbalanceerror as e:    # handle the custom exception    print(f"error: {e}")

在这个例子中,我们定义了一个自定义异常 walletbalanceerror 来处理钱包余额不符合要求的情况。如果钱包余额不足,check_wallet_balance 函数会引发此异常,并提供清晰具体的错误消息。

python 中的自定义异常通过明确定义特定的错误条件并以结构化方式处理它们,帮助使代码更具可读性和可维护性。

现在我们知道了如何处理 python 中的错误,是时候了解发生这些错误时该怎么办了。有很多策略,但记录这些错误可以帮助以后发现问题并纠正它们。在本文的下一部分中,我们将探讨日志记录。

使用 python 进行日志记录

日志记录可帮助开发人员跟踪应用程序或程序中的错误、事件或任何运行时信息。日志记录是软件工程的一个重要且关键的方面,因为它能够记录开发后应用程序中所有正确或错误的情况。日志记录是监控最重要的支柱之一。

python 提供了一个内置模块,可用于日志记录

目的。要使用这个模块,首先要做的就是导入它。

import logging

然后,使用 basicconfig 方法配置记录器。您需要向其传递参数,例如日志级别、消息的格式以及保存日志的输出文件。

import logging# set up the basic configuration for logginglogging.basicconfig(filename='app.log', level=logging.debug,                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')# log messages of various severity levelslogging.debug('this is a debug message')logging.info('this is an info message')logging.warning('this is a warning message')logging.error('this is an error message')logging.critical('this is a critical message')

在上面的示例中,日志将写入名为 app.log 的文件中。日志消息格式包括时间戳、记录器名称、日志级别和实际消息。

python 日志记录具有不同的日志级别,指示事件或消息的严重性。这些日志级别允许您根据消息的重要性对其进行分类和过滤。以下是 python 中常见日志级别的细分:

日志级别

debug:详细信息,通常仅在诊断问题时才有意义。用于开发过程中的调试目的。

info:确认事情按预期进行。这是您用于正常操作和信息性消息的级别。

警告:表示发生了意外情况,或表示不久的将来会出现一些问题(例如“磁盘空间不足”)。该软件仍然按预期工作。

错误:由于更严重的问题,软件无法执行某些功能。错误表示存在需要注意的重大问题。

critical:非常严重的错误,表明程序本身可能无法继续运行。严重错误通常代表需要立即采取行动的严重问题。

日志记录模块允许您通过设置日志记录级别来控制记录哪些消息。仅记录等于或高于设定级别的消息。默认级别是 warning,这意味着除非您更改日志配置,否则只会记录 warning、error 和 critical 消息。

在上面的代码示例中,我们将日志记录级别设置为 debug,这意味着所有日志消息(debug、info、warning、error 和 critical)都将记录在 app.log 文件中。

您还可以创建自定义记录器,这使您可以更好地控制消息的记录方式。自定义记录器允许您设置具有不同配置的多个记录器,例如不同的日志级别、格式或输出目标。这在需要为不同模块或组件分离日志的大型应用程序中特别有用。

以下是创建和使用自定义记录器的方法:

import logging# create a custom loggerlogger = logging.getlogger('my_custom_logger')# set the log level for the custom loggerlogger.setlevel(logging.debug)# create a file handler to write logs to a filefile_handler = logging.filehandler('custom.log')# create a console handler to output logs to the consoleconsole_handler = logging.streamhandler()# set log levels for the handlersfile_handler.setlevel(logging.error)console_handler.setlevel(logging.debug)# create a formatter for log messagesformatter = logging.formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')# add the formatter to the handlersfile_handler.setformatter(formatter)console_handler.setformatter(formatter)# add the handlers to the loggerlogger.addhandler(file_handler)logger.addhandler(console_handler)# log messages using the custom loggerlogger.debug('this is a debug message')logger.info('this is an info message')logger.warning('this is a warning message')logger.error('this is an error message')logger.critical('this is a critical message')

在此示例中,我们创建一个名为 my_custom_logger 的自定义记录器。该记录器将 error 和更严重的消息写入名为 custom.log 的文件,而 debug 和更严重的消息则输出到控制台。通过自定义记录器,您可以定制日志记录行为以满足应用程序的特定需求。

真实示例:登录 web 应用程序

在 web 应用程序中,日志记录在监控和维护系统健康方面起着至关重要的作用。例如,在 flask web 应用程序中,您可以使用日志记录来跟踪传入请求、错误和性能指标。

这是如何在 flask 应用程序中使用日志记录的基本示例:

from flask import Flask, requestimport loggingapp = Flask(__name__)# Set up the basic configuration for logginglogging.basicConfig(filename='webapp.log', level=logging.INFO,                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')@app.route('/')def index():    app.logger.info('Index page accessed')    return 'Welcome to the Flask Web Application!'@app.route('/error')def error():    app.logger.error('Error page accessed')    raise ValueError('This is a simulated error')if __name__ == '__main__':    app.run(debug=True)

在此 flask 应用程序中,我们配置日志记录以将日志写入名为 webapp.log 的文件。每次访问索引页时,都会记录一条信息日志消息。如果访问错误页面,则会记录错误日志消息,并引发模拟错误。

通过在 web 应用程序中实现日志记录,您可以深入了解用户活动、系统错误和性能问题。此信息对于调试、故障排除和优化应用程序非常宝贵。

结论

错误处理和日志记录是软件开发的重要方面,可确保应用程序顺利运行并快速识别和解决任何问题。

在本文中,我们探讨了 python 中的异常,包括如何使用 try/except 处理异常,以及日志记录对于跟踪错误和事件的重要性。我们还讨论了如何创建自定义异常和自定义记录器以满足特定应用程序的需求。

通过掌握错误处理和日志记录,您将能够更好地构建强大且可维护的软件,可以优雅地处理意外情况并为其操作提供有价值的见解。

如果您喜欢这篇文章,请考虑订阅我的时事通讯,这样您就不会错过未来的更新。

您的反馈很有价值!如果您有任何建议、批评或疑问,请在下面留言。

以上就是Python 中的错误处理和日志记录的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1348967.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月13日 12:28:33
下一篇 2025年12月13日 12:28:49

相关推荐

  • 代码气味 – 蹲着

    不要提前在关键任务资源上使用可猜测的名称 tl;dr:通过避免可预测的命名模式来保护您的云资源。 问题 可预测的名字 未经授权的访问 数据暴露风险 影子资源 帐户接管 idor 漏洞 过早优化 解决方案 使用带有暗键的独特存储桶名称 验证创建的所有权 充分保障资源 间接混淆真实姓名 书名防止抢注 随…

    2025年12月13日
    000
  • 避免条件语句的智慧

    循环复杂度是衡量代码复杂性和混乱程度的指标。 高圈复杂度并不是一件好事,恰恰相反。 简单来说,圈复杂度与程序中可能的执行路径的数量成正比。换句话说,圈复杂度和条件语句的总数(尤其是它们的嵌套)密切相关。 所以今天我们来谈谈条件语句。 反如果 2007年,francesco cirillo发起了一场名…

    2025年12月13日
    000
  • Django AllAuth 章 使用自定义字段扩展 Django AllAuth 用户模型

    注意:本文最初发布在我的 substack 上,网址为 https://andresalvareziglesias.substack.com/ 这是 django allauth 系列文章的最后一章。在这五章中,我们发现了一个小奇迹,一个非常有用的 django 组件来处理我们所有的身份验证需求。在…

    2025年12月13日
    000
  • 如何使用 Ollama 和 LangChain 创建本地 RAG 代理

    什么是 rag? rag 代表检索增强生成,这是一种强大的技术,旨在通过以文档形式为大型语言模型(llm)提供特定的相关上下文来增强其性能。与纯粹根据预先训练的知识生成响应的传统法学硕士不同,rag 允许您通过检索和利用实时数据或特定领域的信息,使模型的输出与您期望的结果更紧密地结合起来。 rag …

    2025年12月13日
    000
  • 如何构建简单的 AI 代理:分步指南

    人工智能无处不在,从回答您问题的聊天机器人到管理您日程安排的智能助手。但您是否知道只需几步即可构建自己的人工智能代理?无论您是开发人员还是好奇的爱好者,本指南都将向您展示如何创建一个可以执行基本任务的简单 ai 代理,同时让事情变得有趣和简单。 ? ?️ 第 1 步:定义 ai 代理的使命 首先,决…

    2025年12月13日
    000
  • 释放 Python 脚本的力量:日复一日的 DevOps 工具系列

    欢迎来到“50 天 50 个 devops 工具”系列的第 28 天!今天,我们将深入探讨 python 脚本世界——这是任何 devops 专业人员的一项关键技能。 python 以其简单性、可读性和广泛的库支持而闻名,已成为自动化任务、管理基础设施和开发可扩展应用程序的重要工具。 为什么 pyt…

    2025年12月13日
    000
  • 使用 Diffuser 运行 Fluxn Mac

    什么是扩散器? 拥抱脸 / 扩散器 ? diffusers:最先进的扩散模型,用于 pytorch 和 flax 中的图像和音频生成。 ? diffusers 是最先进的预训练扩散模型的首选库,用于生成图像、音频甚至分子的 3d 结构。无论您是在寻找简单的推理解决方案还是训练自己的扩散模型,? di…

    2025年12月13日 好文分享
    000
  • 使用 Asyncio 创建和管理任务

    asyncio 允许开发者轻松地用 python 编写异步程序。该模块还提供了多种异步任务的方法,并且由于执行方法多种多样,因此可能会让人困惑于使用哪一种。 在本文中,我们将讨论使用 asyncio 创建和管理任务的多种方法。 什么是异步任务? 在 asyncio 中,task 是一个包装协程并安排…

    2025年12月13日
    000
  • 了解 Python 中常规类和数据类之间的差异

    介绍 在python中定义数据结构可以通过各种方法来完成。两种常用的方法是常规类和数据类。了解这两种方法之间的差异有助于为给定任务选择最合适的选项。本文对常规类和数据类进行了比较分析,强调了它们各自的特点和适当的用例。 常规课程 python 中的常规类是创建对象的传统方式。它需要对各种方法和属性进…

    2025年12月13日
    000
  • 关于如何使用 pip 安装你需要知道的一切

    在本文中,我们正在研究使用 pip 将代码安装到虚拟环境中的不同方法。 这些会变得更加复杂,但不用担心,我会全程陪伴您。 拍拍你的背 废话说够了!让我们从简单的事情开始吧。 安装本地存储库 假设以下情况:您刚刚签出了存储库并想要安装需求。 这可以通过使用以下命令轻松完成……当…

    2025年12月13日
    000
  • 在深入了解 Nylas 之前需要了解的关键概念

    在深入研究 nylas 之前必须了解的概念 所以,我已经准备好开始使用 nylas 及其强大的 api,但在开始之前,值得花点时间确保我很好地掌握了一些基本概念。这些构建块不仅可以帮助我有效地使用 nylas,还可以使我的开发过程更加顺利和安全。 1.python虚拟环境:保持整洁 让我们从pyth…

    2025年12月13日
    000
  • Python-文件

    文件操作: 文件读取文件写入追加内容 文件读取:以 open(‘logs.txt’, ‘r’) 作为文件: open是python内置函数,用于打开文件。第一个参数是文件名,第二个参数是读取模式。with语句用于自动关闭文件。这将防止内存泄漏,提供更好…

    2025年12月13日
    000
  • 使用 AWS 学习 Python – 第 2 天

    虚拟环境 今天我们将学习虚拟环境。 python 中的虚拟环境是一个容器,所有代码和其他 python 包都驻留在其中。它允许您将 python 配置与系统上的其他版本分开。开发 python 代码时始终使用虚拟环境是一个好主意。 要创建虚拟环境,我们将使用以下命令: python -m venv …

    2025年12月13日
    000
  • Python 库初学者指南

    python 以其简单性和多功能性而闻名,使其成为初学者和专业人士的热门选择。 python 最强大的功能之一是其广泛的库集合。这些库是预先编写的代码的集合,您可以使用它们来执行常见任务,从而节省您的时间和精力。在这篇博客中,我们将探索每个初学者都应该知道的一些基本 python 库。 1.什么是p…

    2025年12月13日
    000
  • tea-tasting:用于 A/B 测试统计分析的 Python 包

    简介 我开发了tea-tasting,一个用于 a/b 测试统计分析的 python 包,具有​​: 学生的 t 检验、bootstrap、cuped 方差缩减、功效分析以及其他开箱即用的统计方法和方法。支持广泛的数据后端,例如 bigquery、clickhouse、postgresql/gree…

    2025年12月13日
    000
  • Python – 字典、集合、元组

    这三个都是python中不同类型的数据结构。这用于存储不同的数据集合。根据我们要求的用例,我们需要在其中进行选择。 字典(dict): 字典是键值对的集合,其中每个键与一个值关联可以根据键值检索数据(基于键的搜索),因为键要求是唯一的。字典在 3.7 之前都是无序的,值可以更改。密钥名称不能直接更改…

    2025年12月13日
    000
  • 精通编码之路初学者指南

    您已经掌握了编码的基础知识。循环、函数,甚至简单的网站都在你的掌握之中。 但是从休闲程序员转变为专业程序员需要什么? 好吧,我在这里帮助正在寻找相同东西的初学者。 让我们潜入吧。 专业心态:不仅仅是代码 解决问题 编码既是关于编写代码,也是关于解决问题。将复杂的问题分解为更小的、可管理的步骤至关重要…

    2025年12月13日
    000
  • 使用 FastAPI 和机器学习构建实时信用卡欺诈检测系统

    介绍 信用卡欺诈对金融业构成重大威胁,每年造成数十亿美元的损失。为了解决这个问题,人们开发了机器学习模型来实时检测和防止欺诈交易。在本文中,我们将逐步介绍使用 fastapi(python 的现代 web 框架)以及在 kaggle 流行的信用卡欺诈检测数据集上训练的随机森林分类器构建实时信用卡欺诈…

    2025年12月13日
    000
  • Jupyter Notebooks 作为端到端分析解决方案

    介绍 你醒了。您查看待办事项列表,发现团队成员有一项任务。他们希望您进行某种分析并生成报告。请求本身相对复杂,这意味着您可能需要使用问题陈述对其进行分解,从数据源中提取数据,进行探索,收集您的见解,然后向团队成员讲述您的发现故事。 解决这个问题的方法如下: 在任务跟踪平台(例如 Trello、Jir…

    2025年12月13日
    000
  • 为什么我的 Google Colab 会话在运行 Llama 模型时崩溃?

    我正在尝试使用 meta-llama/llama-2-7b-hf 模型并在我的场所本地运行它,但会话在此过程中崩溃了。 我正在尝试使用 meta-llama/llama-2-7b-hf 模型并在我的场所本地运行它。为此,我使用 google colab 并从 hugging face 获取了访问密钥…

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信