如何以异常安全的方式处理MATLAB中的资源?(比如"试试......终于")

snt*_*nth 29 file-io matlab exception-handling

由于MATLAB中的try-catch块没有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);
Run Code Online (Sandbox Code Playgroud)

我发现在两个地方都有fclose功能,很容易出错.

这样做有更好的方法吗?

gno*_*ice 36

我建议检查一下ONCLEANUP对象.它们允许您在退出函数时自动运行代码(更具体地说,从内存中清除ONCLEANUP对象时).洛伦来自MathWorks讨论这个在她的博客文章的一个位置.如果将上面的代码放在函数中,它可能看起来像这样:

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
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢.这正是我想要的.我已经在Matlab中对onCleanup和新样式类进行了更多的阅读,在我看来,现在使用句柄类,你可以在Matlab中练习适当的RAII,这很棒. (2认同)

Nzb*_*buu 7

我的偏好是FileHandle使用一个delete方法创建一个类,该方法在对象超出范围时关闭文件.还为您提供了进行其他更自然的文件处理的机会.