文件读写无异常执行路径及跟踪内存分配失败优雅处理问询
针对文件操作异常捕获与内存分配失败的解决方案
先聊聊你遇到的两个问题,我给你整理了具体的处理思路和代码示例:
一、解决文件打开/写入无法捕获异常的问题
你说抓不到文件操作的异常路径,大概率是没把关键操作放在try-except块里,或者捕获的异常类型不够精准。给你两个核心处理要点:
- 用
with语句管理文件句柄,它会自动处理文件的打开与关闭,同时能确保异常被正确捕获; - 优先捕获具体的文件相关异常(Python3里是
OSError,它涵盖了权限不足、文件不存在、磁盘满等多种场景),再用泛型Exception兜底其他意外情况。
示例代码:
from __future__ import print_function import time # 模拟文件操作的异常捕获逻辑 try: # with语句自动管理文件资源,无需手动close with open("test_write.txt", "w") as f: f.write(f"操作时间:{time.ctime()}\n") # 可取消注释测试异常触发:f.write("a" * 10**12) except OSError as e: print(f"文件操作异常:[{e.errno}] {e.strerror}") except Exception as e: # 兜底捕获其他未预料的异常 print(f"未知异常:{str(e)}")
二、优雅处理内存分配失败的情况
内存分配失败会触发MemoryError,我们可以从提前预防和事后清理两方面入手:
- 提前监控内存:可以调用
free -m解析输出,或者用psutil库(需提前安装:pip install psutil)实时检查内存占用,当达到阈值时主动拒绝新请求; - 异常后优雅清理:捕获到
MemoryError后,立即释放不必要的资源(比如大列表、缓存对象),记录错误日志,再选择降级服务或优雅退出。
结合你的脚本需求(用free -m观察内存变化),整合后的示例代码:
#!/usr/bin/python # -*- coding: utf-8 -*- from __future__ import print_function from datetime import datetime import subprocess import os import time def get_memory_usage(): # 调用free -m并解析内存占用百分比 result = subprocess.check_output(["free", "-m"]).decode("utf-8") mem_line = result.split("\n")[1].split() used = int(mem_line[2]) total = int(mem_line[1]) return used / total * 100 try: # 提前检查内存,超过80%则拒绝执行内存密集操作 mem_percent = get_memory_usage() print(f"当前内存占用:{mem_percent:.1f}%") if mem_percent > 80: raise MemoryError(f"内存占用过高({mem_percent:.1f}%),无法执行操作") # 模拟内存密集型请求处理 large_data = [i for i in range(10**7)] print("内存密集型操作执行完成") # 写入操作日志 with open("memory_log.txt", "a") as f: f.write(f"{datetime.now()}: 内存操作完成,占用{mem_percent:.1f}%\n") except MemoryError as e: print(f"内存分配失败:{str(e)}") # 立即清理大对象释放内存 if 'large_data' in locals(): del large_data # 记录错误日志 with open("error_log.txt", "a") as f: f.write(f"{datetime.now()}: 内存错误 - {str(e)}\n") except OSError as e: print(f"文件操作错误:[{e.errno}] {e.strerror}") except Exception as e: print(f"未知错误:{str(e)}") time.sleep(20) # 留足时间用free -m观察内存变化
额外给你两个小建议:
- 针对请求过多的场景,可以加限流机制(比如用队列控制并发请求数),避免瞬间占用大量内存;
- 如果是长期运行的服务,可用
tracemalloc模块跟踪内存分配,排查潜在的内存泄漏问题。
内容的提问来源于stack exchange,提问作者Doug Smythies
相关产品推荐
相关产品推荐

