Python异常处理与日志记录的操作过程

Python异常处理与日志记录的操作过程
最新回答
碍人

2026-04-12 09:24:37

Python异常处理与日志记录的操作过程主要包括异常处理机制的实现、日志记录功能的配置,以及两者的结合应用。以下是具体操作步骤和最佳实践:

一、Python异常处理机制
  1. 基础异常捕获使用try-except语句捕获特定异常,例如:

    try: result = 10 / 0except ZeroDivisionError: print("除零错误发生!")

    关键点:明确捕获特定异常类型(如ZeroDivisionError),避免笼统捕获所有异常导致调试困难。

  2. 多异常处理与通用捕获

    捕获多种异常类型:

    try: # 可能引发多种异常的代码 passexcept (ValueError, TypeError) as e: print(f"值或类型错误:{e}")

    通用异常捕获(慎用):

    except Exception as e: print(f"未知错误:{e}")
  3. else与finally子句

    else:无异常时执行:

    try: result = 10 / 2except ZeroDivisionError: print("错误")else: print(f"结果:{result}") # 输出结果:5.0

    finally:无论是否异常均执行(常用于资源清理):

    file = Nonetry: file = open("test.txt", "r")except FileNotFoundError: print("文件不存在")finally: if file: file.close()
二、Python日志记录功能
  1. 基础日志配置使用logging模块记录不同级别日志:

    import logginglogging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', filename='app.log')logging.info("这是一条信息日志")logging.error("这是一条错误日志")

    参数说明:

    level:设置日志级别(如DEBUG、INFO、ERROR)。

    format:定义日志格式(时间、模块名、级别、消息)。

    filename:指定日志文件路径。

  2. 高级日志配置

    分离处理器与格式器:

    logger = logging.getLogger(__name__)logger.setLevel(logging.DEBUG)file_handler = logging.FileHandler('app.log')file_handler.setLevel(logging.INFO)formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')file_handler.setFormatter(formatter)logger.addHandler(file_handler)logger.info("高级配置日志示例")

    多处理器输出(如同时输出到文件和控制台):

    console_handler = logging.StreamHandler()console_handler.setLevel(logging.WARNING)logger.addHandler(console_handler)
三、异常处理与日志记录的结合
  1. 在异常处理中记录日志捕获异常时记录详细错误信息:

    try: result = 10 / 0except ZeroDivisionError as e: logging.error(f"除零错误:{e}", exc_info=True) # exc_info记录堆栈信息
  2. 完整示例:函数级异常与日志集成

    import logginglogging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')def divide(x, y): try: result = x / y except ZeroDivisionError as e: logging.error(f"除零错误:{e}") raise # 可选择重新抛出异常 except Exception as e: logging.error(f"未知错误:{e}") raise else: logging.info(f"计算结果:{result}") return result finally: logging.debug("函数执行结束") # 调试级别日志divide(10, 2) # 正常执行divide(10, 0) # 触发异常并记录日志
四、进阶技巧与最佳实践
  1. 上下文管理器(with语句)自动管理资源(如文件、数据库连接):

    try: with open("data.txt", "r") as file: content = file.read()except FileNotFoundError: logging.error("文件未找到")
  2. 自定义装饰器统一处理异常

    def log_exceptions(func): def wrapper(*args, kwargs): try: return func(*args, kwargs) except Exception as e: logging.error(f"函数 {func.__name__} 错误:{e}") raise return wrapper@log_exceptionsdef risky_operation(): return 10 / 0
  3. 日志轮转与归档使用RotatingFileHandler或TimedRotatingFileHandler避免日志文件过大:

    from logging.handlers import RotatingFileHandlerhandler = RotatingFileHandler( 'app.log', maxBytes=1024*1024, backupCount=5 # 1MB大小,保留5个备份)logger.addHandler(handler)
  4. 结构化日志(JSON格式)使用structlog或自定义格式器输出结构化日志:

    import jsonclass JsonFormatter(logging.Formatter): def format(self, record): log_record = { 'time': record.asctime, 'level': record.levelname, 'message': record.getMessage() } return json.dumps(log_record)handler.setFormatter(JsonFormatter())
五、关键注意事项
  • 日志级别选择:生产环境建议使用INFO或WARNING,调试时使用DEBUG。
  • 敏感信息过滤:避免在日志中记录密码、密钥等敏感数据。
  • 性能优化:异步日志库(如Loguru)可减少日志写入对性能的影响。
  • 国际化支持:使用gettext模块实现多语言日志消息。
图:异常处理与日志记录的核心流程

通过合理应用上述方法,可构建健壮的Python应用,实现错误快速定位、系统状态可追溯及运维效率提升。