2026-04-12 09:24:37
Python异常处理与日志记录的操作过程主要包括异常处理机制的实现、日志记录功能的配置,以及两者的结合应用。以下是具体操作步骤和最佳实践:
一、Python异常处理机制基础异常捕获使用try-except语句捕获特定异常,例如:
try: result = 10 / 0except ZeroDivisionError: print("除零错误发生!")关键点:明确捕获特定异常类型(如ZeroDivisionError),避免笼统捕获所有异常导致调试困难。
多异常处理与通用捕获
捕获多种异常类型:
try: # 可能引发多种异常的代码 passexcept (ValueError, TypeError) as e: print(f"值或类型错误:{e}")通用异常捕获(慎用):
except Exception as e: print(f"未知错误:{e}")else与finally子句
else:无异常时执行:
try: result = 10 / 2except ZeroDivisionError: print("错误")else: print(f"结果:{result}") # 输出结果:5.0finally:无论是否异常均执行(常用于资源清理):
file = Nonetry: file = open("test.txt", "r")except FileNotFoundError: print("文件不存在")finally: if file: file.close()基础日志配置使用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:指定日志文件路径。
高级日志配置
分离处理器与格式器:
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)在异常处理中记录日志捕获异常时记录详细错误信息:
try: result = 10 / 0except ZeroDivisionError as e: logging.error(f"除零错误:{e}", exc_info=True) # exc_info记录堆栈信息完整示例:函数级异常与日志集成
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) # 触发异常并记录日志上下文管理器(with语句)自动管理资源(如文件、数据库连接):
try: with open("data.txt", "r") as file: content = file.read()except FileNotFoundError: logging.error("文件未找到")自定义装饰器统一处理异常
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日志轮转与归档使用RotatingFileHandler或TimedRotatingFileHandler避免日志文件过大:
from logging.handlers import RotatingFileHandlerhandler = RotatingFileHandler( 'app.log', maxBytes=1024*1024, backupCount=5 # 1MB大小,保留5个备份)logger.addHandler(handler)结构化日志(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())通过合理应用上述方法,可构建健壮的Python应用,实现错误快速定位、系统状态可追溯及运维效率提升。