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

python日志、异常和装饰器的结合

1.loguru 日志

loguru 是一个强大的日志记录库,提供了简洁易用的API,比标准的 logging 模块更友好。它内置了许多高级特性,比如颜色输出、异步支持、日志轮转等。

from loguru import logger# 简单的日志记录
logger.debug("这是一个调试消息")
logger.info("这是一个信息消息")
logger.warning("这是一个警告消息")
logger.error("这是一个错误消息")
logger.critical("这是一个严重错误消息")# 日志记录到文件并设置轮转
logger.add("file_{time}.log", rotation="500 MB")  # 每500MB创建一个新文件# 记录带参数的日志
name = "Alice"
age = 30
logger.info("名字: {name}, 年龄: {age}", name=name, age=age)

功能概述

基础日志级别:与 logging 模块类似,loguru 也支持多种日志级别,如 DEBUG, INFO, WARNING, ERROR, 和 CRITICAL。

日志格式:loguru 会自动输出格式化的日志信息,包括时间、级别、消息等,可以自定义格式。

日志轮转:可以轻松设置日志文件的轮转规则,例如基于文件大小、时间或其他条件。

异步支持:loguru 可以异步记录日志,适合在高并发环境中使用。

颜色支持:loguru 在控制台输出时,默认带有颜色标注,便于阅读。

2. 异常

在Python中,异常处理用于捕获和处理在程序执行过程中可能发生的错误,从而避免程序崩溃。异常处理通常使用 try, except, else, 和 finally 语句。

try:result = 10 / 2
except ZeroDivisionError:print("不能除以零!")
else:print(f"计算结果是: {result}")
try:file = open("somefile.txt", "r")# 处理文件
except FileNotFoundError:print("文件未找到!")
finally:file.close()print("文件已关闭")
class MyCustomError(Exception):passtry:raise MyCustomError("这是一个自定义错误")
except MyCustomError as e:print(e)
try:result = 10 / 0
except Exception as e:print(f"发生了一个异常: {e}")

小结

try 块:放置可能引发异常的代码。
except 块:处理特定异常。
else 块:在没有异常发生时执行。
finally 块:无论是否发生异常,都会执行的代码。
通过这些工具,你可以编写更加健壮的Python代码,避免因未处理的异常导致程序崩溃。

3.装饰器

Python装饰器是一个非常强大的工具,用于修改或增强函数或方法的行为。装饰器本质上是一个函数,它接收另一个函数作为参数,并返回一个新的函数。装饰器通常用于日志记录、访问控制、缓存、性能测量等场景。

def my_decorator(func):def wrapper():print("在函数执行之前做一些事情")func()print("在函数执行之后做一些事情")return wrapper@my_decorator
def say_hello():print("Hello!")say_hello()
def repeat(num_times):def decorator(func):def wrapper(*args, **kwargs):for _ in range(num_times):func(*args, **kwargs)return wrapperreturn decorator@repeat(num_times=3)
def greet(name):print(f"Hello, {name}!")greet("Alice")
def log(func):def wrapper(*args, **kwargs):print(f"调用函数 {func.__name__},参数: {args}, {kwargs}")result = func(*args, **kwargs)print(f"函数 {func.__name__} 返回: {result}")return resultreturn wrapper@log
def add(x, y):return x + yadd(2, 3)
def require_login(func):def wrapper(user, *args, **kwargs):if not user.is_authenticated:raise PermissionError("你必须登录才能访问这个功能")return func(user, *args, **kwargs)return wrapper@require_login
def view_profile(user):print(f"显示用户 {user.name} 的个人资料")# 假设有一个用户对象
user = User(name="Alice", is_authenticated=True)
view_profile(user)

装饰器是Python中一种优雅的语法,可以为函数或方法添加额外的行为。通过理解装饰器的结构和应用场景,你可以编写出更加灵活和可重用的代码。

4. 错误追踪

如果你想要获取完整的错误追踪信息,可以使用 traceback 模块:


import tracebacktry:result = 10 / 0
except ZeroDivisionError:error_message = traceback.format_exc()  # 将追踪信息保存为字符串print(error_message)# 或将追踪信息写入文件with open('error.log', 'w') as f:f.write(error_message)import sys
import tracebackdef custom_traceback():exc_type, exc_value, exc_traceback = sys.exc_info()trace = ''.join(traceback.format_exception(exc_type, exc_value, exc_traceback))return tracetry:result = 10 / 0
except ZeroDivisionError:trace_info = custom_traceback()print(f"自定义追踪信息:\n{trace_info}")

5.完整代码

from loguru import logger
import tracebacklogger.add("log.log")
logger.add(sys.stdout, level='INFO', format='{message}')def printInfo(func):def log(*args, **kwargs):try:return func(*args, **kwargs)except Exception as e:logger.info(e)print ("error: ",e,traceback.format_exc())logger.info(traceback.format_exc())return log

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • LeetCode.676.实现一个魔法字典
  • scoket通信 -- 网络字节序
  • QT:QTableWidget 设置单元格边距
  • 【gitlab】gitlab-ce:17.3.0-ce.0 1:使用docker engine安装
  • 选择排序(C语言)以及选择排序优化
  • 学习C语言第十七天
  • 数据结构day02(链表)
  • luckyexcel 编辑预览excel文件
  • 【机器学习第9章——聚类】
  • elasticsearch 字段类型的索引、字段类型修改、字段类型、分页、排序、分组、聚合
  • Java+vue3+element-plus+ts上传图片到服务器并返回图片可访问链接
  • 关于SOA和微服务
  • docker swarm如何让两个副本分别跑在两台不同的主机上
  • ubuntu 24.04 软件源配置,替换为国内源
  • 【GitLab】使用 Docker 安装 GitLab:配置 SSH 端口
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 「译」Node.js Streams 基础
  • 2017 年终总结 —— 在路上
  • angular2开源库收集
  • classpath对获取配置文件的影响
  • Django 博客开发教程 16 - 统计文章阅读量
  • fetch 从初识到应用
  • JS基础之数据类型、对象、原型、原型链、继承
  • Node + FFmpeg 实现Canvas动画导出视频
  • Phpstorm怎样批量删除空行?
  • 阿里云应用高可用服务公测发布
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 使用common-codec进行md5加密
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 小程序开发中的那些坑
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 在weex里面使用chart图表
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • linux 淘宝开源监控工具tsar
  • 带你开发类似Pokemon Go的AR游戏
  • 如何在招聘中考核.NET架构师
  • ​ArcGIS Pro 如何批量删除字段
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #Ubuntu(修改root信息)
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (MATLAB)第五章-矩阵运算
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (备份) esp32 GPIO
  • (一)WLAN定义和基本架构转
  • (转)【Hibernate总结系列】使用举例
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)详解PHP处理密码的几种方式
  • (状压dp)uva 10817 Headmaster's Headache
  • .NET Core 成都线下面基会拉开序幕
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET Micro Framework 4.2 beta 源码探析
  • .Net 高效开发之不可错过的实用工具