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

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

 gnovice08 июл. 2009 г., 16:16
Это всего лишь второстепенный вопрос, но я бы предложил не использовать имя переменной & quot; line & quot; в вашем коде. Это может привести к некоторой путанице, так как уже есть встроенная функция под названием LINE.
 Andrey Rubshtein24 февр. 2012 г., 22:55
Также проверьтеstackoverflow.com/questions/8847866/…

Ответы на вопрос(2)

Решение Вопроса

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

 05 февр. 2015 г., 18:22
Предыдущая функция удаления изonCleanup (fclose(fid)) также вызывается, если строкаc = onCleanup(@()fclose(fid)); вызывается снова, в цикле или около того.
 snth10 июл. 2009 г., 08:46
Благодарю. Это именно то, что я искал. Я еще немного изучил onCleanup и новые классы стилей в Matlab в целом, и мне кажется, что теперь с дескрипторными классами вы можете практиковать правильный RAII в Matlab, и это здорово.
 09 апр. 2013 г., 22:52
@gnovice Спасибо за подтверждение, что другие ответы должны работать в R2006b; Я не был уверен, поддержит ли их R2006b. onCleanup - это только одна из нескольких функций, которые я хотел бы использовать, но у нас есть клиенты, которые разрабатывают критически важное для безопасности программное обеспечение и имеют только квалифицированные конкретные версии MATLAB для своих наборов инструментов, поэтому, к сожалению, поддержка R2006b является жестким требованием в этом случае. Еще раз спасибо :)
 09 апр. 2013 г., 19:49
@rob: Я бы посоветовал пользователям не позволять своему программному обеспечению устареть на 7 лет. ;) Серьезный ответ: поскольку R2006b допускает объектно-ориентированное программирование, создание класса для обработки файлового ввода-вывода - это путь, которым я бы пошел, как предложено вNzbuu's answer и ответыthis related question.
 09 апр. 2013 г., 19:38
onCleanup был впервые представлен в MATLAB 7.6 (R2008a). Что вы предлагаете людям, которые должны поддерживать совместимость со старыми версиями (в частности, R2006b)?

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

 26 февр. 2012 г., 17:37
Привет! Это моя идея;)
 26 февр. 2012 г., 13:40
Больше объяснений здесь -stackoverflow.com/questions/8847866/…

Ваш ответ на вопрос