由于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函数很难看并且容易出错。
有没有更好的方法呢?
答案 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
类,当对象超出范围时,该方法会关闭文件。还为您提供了进行其他更自然的文件处理的机会。