你如何以exception安全的方式处理MATLAB中的资源? (比如“try … finally”)

由于在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函数丑陋和容易出错。

有没有更好的方法来做到这一点?

我会build议检查ONCLEANUP对象。 它们允许你在函数退出时自动运行代码(更具体地说,当ONCLEANUP对象从内存中清除时)。 The MathWorks的Loren在她的一篇博客文章中讨论了这个问题 。 如果你把上面的代码放在一个函数中,它可能看起来像这样:

 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的调用抛出一个exception,ONCLEANUP对象仍然会从load_line函数返回时从内存中清除,从而确保文件被closures。

我的首选是使用delete方法创build一个FileHandle类,该方法在对象超出作用域时closures文件。 也让你有机会做其他更自然的文件处理事情。