matlab - 您如何以异常安全的方式处理 MATLAB 中的资源? (比如 "try ... finally")

标签 matlab file-io exception

由于 MATLAB 中的 try-catch block 没有 finally 子句,我发现自己编写了很多如下代码:

fid = fopen(filename);
if fid==-1
    error('Couldn''t open file');
end
try
   line = getl(fid);
catch ME
   fclose(fid);
   rethrow ME;
end
fclose(fid);

我发现 fclose 函数在两个地方丑陋且容易出错。

有更好的方法吗?

最佳答案

我建议查看 ONCLEANUP对象。它们允许您在函数退出时自动运行代码(更具体地说,当从内存中清除 ONCLEANUP 对象时)。 Loren from The MathWorks在她的一篇博文中对此进行了讨论 here .如果将上面的代码放在一个函数中,它可能看起来像这样:

function data = load_line(filename)
  data = [];
  fid = fopen(filename);
  if fid == -1
      error('Couldn''t open file');
  end
  c = onCleanup(@()fclose(fid));
  data = getl(fid);
end

即使对 GETL 的调用抛出异常,ONCLEANUP 对象仍会在函数 load_line 返回时从内存中清除,从而确保文件被关闭。

关于matlab - 您如何以异常安全的方式处理 MATLAB 中的资源? (比如 "try ... finally"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1098149/

相关文章:

Java Apache Math Commons 逐元素矩阵乘法

matlab - 如何将 tsne() 应用于 MATLAB 表格数据?

MATLAB:保存类属性

python - 具有非常大数组的 numpy tofile() 保存所有零

android - 异步任务 "Only the original thread that created a view hierarchy can touch its views."

matlab - 使用 matlab 进行 EEG 原始数据波段滤波

linux - 从命令行将文本附加到文件而不使用 io 重定向

java - aws s3 java sdk 下载 pdf 损坏

异常(exception):迭代期间的并发修改: '_GrowableList' 的实例(长度:17)

c# - 如何区分 BackgroundWorker.RunWorkerCompleted 事件处理程序中的不同异常类型