
在这个例子中,divide() 函数内部会触发 zerodivisionerror 异常。@logger.catch 装饰器装饰了 main() 函数,因此 main() 函数内部未捕获的异常会被 loguru 捕获并记录到日志文件中。
代码解释:
- from loguru import logger: 导入 Loguru 库的 logger 对象。
- @logger.catch: 这个装饰器告诉 Loguru 捕获 main() 函数中发生的任何未处理的异常。
- main(): 程序的入口点。
- divide(): 一个简单的函数,用于演示异常的产生。这里故意触发一个 ZeroDivisionError 异常。
- if __name__ == "__main__":: Python 的标准入口点判断。
配置 Loguru
确保 Loguru 已经正确配置,以便将日志输出到文件。例如:
import sys
from loguru import logger
import os
root_dir = os.path.dirname(os.path.abspath(__file__))
log_level = "DEBUG" # 设置日志级别
logger.remove(0) # 删除默认的handler,否则会重复打印
log_format = "<green>{time:YYYY-MM-DD HH:mm:ss.SSS zz}</green> | <level>{level: <8}</level> | <yellow>Line {line: >4} ({file}):</yellow> <b>{message}</b>"
logger.add(sys.stdout, level=log_level, format=log_format, colorize=True, backtrace=True, diagnose=True)
logger.add(root_dir + '/cron_run.log', rotation='2 MB', level=log_level, format=log_format, colorize=False, backtrace=True, diagnose=True)
注意事项:
- @logger.catch 装饰器应该用于装饰程序的入口函数(如 main()),或者任何你希望捕获未处理异常的函数。
- 如果函数内部已经使用了 try...except 块来处理异常,并且你不想让 @logger.catch 再次捕获这些异常,可以在 except 块中重新抛出异常(使用 raise 语句),或者不使用 @logger.catch 装饰器。
- 使用 @logger.catch 会略微增加程序的运行开销,因为它需要在函数调用时添加额外的异常处理逻辑。
总结
通过使用 Loguru 的 @logger.catch 装饰器,可以方便地捕获程序中未处理的异常,并将它们记录到日志文件中。这对于调试和问题排查非常有帮助,可以确保所有重要的信息,包括错误信息,都能被记录下来,方便后续分析。请确保正确配置 Loguru,以便将日志输出到文件,并根据需要选择性地使用 @logger.catch 装饰器。










