Вопрос по exception-handling, file-io, matlab – Как вы обрабатываете ресурсы в MATLAB безопасным способом? (как «попробуй… наконец»)

29

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

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

Это всего лишь второстепенный вопрос, но я бы предложил не использовать имя переменной & quot; line & quot; в вашем коде. Это может привести к некоторой путанице, так как уже есть встроенная функция под названием LINE. gnovice
Также проверьтеstackoverflow.com/questions/8847866/… Andrey Rubshtein

Ваш Ответ

2   ответа
36

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

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

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

Привет! Это моя идея;)
Больше объяснений здесь -stackoverflow.com/questions/8847866/…

Похожие вопросы