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