Как вы обрабатываете ресурсы в MATLAB безопасным образом? (например, "попробуй... наконец" )

Поскольку в блоке 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 в двух местах, уродливых и подверженных ошибкам.

Есть ли лучший способ для этого?

Ответ 1

Я бы предложил проверить 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, тем самым гарантируя закрытие файла.

Ответ 2

Мое предпочтение заключается в создании класса FileHandle с методом delete, который закрывает файл, когда объект выходит из области видимости. Также дает вам возможность делать другие более естественные действия с файлами.