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):
    pass

try:
    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 wrapper
    return 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 result
    return wrapper

@log
def add(x, y):
    return x + y

add(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 traceback

try:
    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 traceback

def custom_traceback():
    exc_type, exc_value, exc_traceback = sys.exc_info()
    trace = ''.join(traceback.format_exception(exc_type, exc_value, exc_traceback))
    return trace

try:
    result = 10 / 0
except ZeroDivisionError:
    trace_info = custom_traceback()
    print(f"自定义追踪信息:\n{trace_info}")

5.完整代码

from loguru import logger
import traceback


logger.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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佐倉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值