Как вы обрабатываете ресурсы в MATLAB безопасным способом? (как «попробуй… наконец»)

30

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

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

  • 3
    Это всего лишь второстепенный вопрос, но я бы предложил не использовать имя переменной «строка» в вашем коде. Это может привести к некоторой путанице, так как уже есть встроенная функция под названием LINE.
  • 0
    Также проверьте stackoverflow.com/questions/8847866/…
Теги:
exception-handling
file-io

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

  • 2
    Благодарю. Это именно то, что я искал. Я еще немного изучил onCleanup и новые классы стилей в Matlab в целом, и мне кажется, что теперь с дескрипторными классами вы можете практиковать правильный RAII в Matlab, и это здорово.
  • 0
    onCleanup был впервые представлен в MATLAB 7.6 (R2008a). Что вы предлагаете людям, которые должны поддерживать совместимость со старыми версиями (в частности, R2006b)?
Показать ещё 3 комментария
7

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню