Python中记录程序报错信息的实践指南

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Python中记录程序报错信息的实践指南

在Python编程中,合理地记录程序中发生的错误是至关重要的。它可以帮助开发者理解程序中存在的问题、监控程序的行为并采取相应的措施来解决这些问题。Python提供了多种方法来捕获和记录错误信息,本篇博客将介绍如何使用标准库中的logging模块以及其他一些技巧来记录错误信息。

logging模块基础

Python的logging模块提供了一套灵活的日志记录系统。与简单的打印语句相比,logging模块可以更详细地记录错误信息,并且可以设置日志记录的级别,如DEBUG、INFO、WARNING、ERROR、CRITICAL等。

首先,我们需要导入logging模块并设置基本配置:

import logging

logging.basicConfig(level=logging.DEBUG, 
                    filename='app.log', 
                    filemode='w', 
                    format='%(name)s - %(levelname)s - %(message)s')

在这里,我们设置了日志记录级别为DEBUG,日志文件名为app.log,日志模式为覆盖写入('w'),以及日志的格式。

示例1: 记录错误信息

下面的例子将演示如何捕获和记录一个简单的除零错误。

import logging

logging.basicConfig(level=logging.ERROR, 
                    filename='app.log', 
                    filemode='a', 
                    format='%(asctime)s - %(levelname)s - %(message)s')

try:
    1 / 0
except ZeroDivisionError:
    logging.error("Attempted to divide by zero.")

如果出现除零错误,它将被except块捕获,随后记录一条ERROR级别的日志信息。

示例2: 记录异常堆栈

有时候,仅仅记录错误信息本身是不够的,我们需要记录错误的堆栈信息以便更深入地调试。

import logging

try:
    open('non_existent_file.txt', 'r')
except FileNotFoundError as e:
    logging.exception("Error occurred while trying to read non_existent_file.txt")

logging.exception方法会自动记录异常的堆栈跟踪信息,即使不将异常赋值给变量e

示例3: 使用不同的日志级别

你可以根据错误的严重性使用不同的日志记录级别。下面是一个如何区分不同级别的例子:

import logging

logging.basicConfig(level=logging.DEBUG)

logging.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')

只有级别等于或高于设定级别的日志记录才会被记录。在上面的配置中,所有级别的日志都会被记录,因为基础级别设置为了DEBUG。

示例4: 配置多个日志处理程序

有时,你可能需要将日志输出到多个位置,比如同时输出到控制台和文件。

import logging

# 创建一个logger
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)

# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('file.log')
fh.setLevel(logging.ERROR)

# 再创建一个handler,用于将日志输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)

# 给logger添加handler
logger.addHandler(fh)
logger.addHandler(ch)

logger.debug('This will be logged to the console.')
logger.error('This will be logged to both the console and the file.')

在这个例子中,所有DEBUG及以上级别的日志会输出到控制台,而ERROR及以上级别的日志会同时输出到控制台和文件file.log

结论

记录程序错误信息是一个编程最佳实践,在Python中,logging模块提供了一个功能强大的系统用于这个目的。正确使用日志记录可以大大提高程序的可维护性和调试效率。希望这篇博客能够帮助你更好地理解和使用Python中的错误记录功能。


目录
相关文章
|
4月前
|
设计模式 SQL 人工智能
Python设计模式:从代码复用到系统架构的实践指南
本文以Python为实现语言,深入解析23种经典设计模式的核心思想与实战技巧。通过真实项目案例,展示设计模式在软件开发中的结构化思维价值,涵盖创建型、结构型、行为型三大类别,并结合Python动态语言特性,探讨模式的最佳应用场景与实现方式,帮助开发者写出更清晰、易维护的高质量代码。
174 1
|
3月前
|
人工智能 Linux 开发工具
Python从零到一:手把手带你写出第一个实用程序
Python语法简洁易懂,适合编程新手入门。它广泛应用于人工智能、自动化办公、Web开发等领域。学习Python可快速搭建项目,拥有丰富库支持和强大社区资源。通过本教程,你将掌握基础语法、环境搭建、程序逻辑控制及实战项目开发,开启编程之旅。
331 0
|
4月前
|
设计模式 人工智能 算法
Python设计模式:从代码复用到系统架构的实践指南
本文探讨了电商系统中因支付方式扩展导致代码臃肿的问题,引出设计模式作为解决方案。通过工厂模式、策略模式、单例模式等经典设计,实现代码解耦与系统扩展性提升。结合Python语言特性,展示了模块化、装饰器、适配器等模式的实战应用,并延伸至AI时代的设计创新,帮助开发者构建高内聚、低耦合、易维护的软件系统。
305 0
|
2月前
|
异构计算 Python
ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
283 1
|
2月前
|
人工智能 Shell Python
ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
196 0
|
2月前
|
设计模式 决策智能 Python
Python条件控制:让程序学会"思考"的魔法
本文深入浅出地讲解Python条件控制,从基础if语句到多分支、嵌套结构,再到简洁的三元表达式与Python 3.10新增的match-case模式匹配,结合电商折扣、会员等级、ATM系统等实战案例,全面掌握程序“智能决策”的核心逻辑。
306 0
|
4月前
|
前端开发 数据安全/隐私保护 Python
虚拟物流单号生成器, 虚拟快递单号假物流信息, 虚拟快递单号在线生成【python框架】
这个虚拟物流单号生成系统包含以下功能:支持多种主流快递公司的单号生成
|
4月前
|
数据安全/隐私保护 数据格式 Python
快递单号模拟生成器, 虚拟物流信息在线生成,虚假快递单号生成器【python】
支持多种主流快递公司生成符合各快递公司规则的快递单号自动生成收发件人信息
|
4月前
|
JSON 前端开发 API
快递单号生成器在线, 快递单号模拟生成器, 虚拟物流信息在线生成【python】
项目包含三个主要模块:快递单号生成器核心逻辑、Flask Web应用程序和前端HTML页面

推荐镜像

更多