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

时间:2009-07-08 13:41:10

标签: matlab file-io 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);

我发现在两个地方使用fclose函数很难看并且容易出错。

有没有更好的方法呢?

2 个答案:

答案 0 :(得分:36)

我建议您查看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的调用抛出异常,在从 load_line 函数返回时,仍会从内存中清除ONCLEANUP对象,从而确保文件被关闭。

答案 1 :(得分:7)

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