You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

文件读写无异常执行路径及跟踪内存分配失败优雅处理问询

针对文件操作异常捕获与内存分配失败的解决方案

先聊聊你遇到的两个问题,我给你整理了具体的处理思路和代码示例:

一、解决文件打开/写入无法捕获异常的问题

你说抓不到文件操作的异常路径,大概率是没把关键操作放在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,我们可以从提前预防和事后清理两方面入手:

  1. 提前监控内存:可以调用free -m解析输出,或者用psutil库(需提前安装:pip install psutil)实时检查内存占用,当达到阈值时主动拒绝新请求;
  2. 异常后优雅清理:捕获到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:55:19