Поскольку в блоке try-catch в MATLAB нет окончательного предложения, я нахожу, что пишу много кода, как показано ниже:
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 очищается из памяти). Лорен из The 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
Даже если вызов GETL вызывает исключение, объект ONCLEANUP по-прежнему будет удален из памяти при возврате из функции load_line, тем самым гарантируя закрытие файла.
Мое предпочтение заключается в создании класса FileHandle
с методом delete
, который закрывает файл, когда объект выходит из области видимости. Также дает вам возможность делать другие более естественные действия с файлами.