Jak radzić sobie z zasobami w MATLAB w bezpieczny sposób? (jak " spróbuj ... w końcu")

Ponieważ w Matlabie nie ma w końcu klauzuli do bloku try-catch, piszę wiele kodu, jak poniżej:

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);

Uważam, że funkcja fclose w dwóch miejscach jest brzydka i podatna na błędy.

Czy jest na to lepszy sposób?
Author: gnovice, 2009-07-08

2 answers

Sugerowałbym sprawdzenie oncleanup obiektów. Pozwalają one na automatyczne uruchamianie kodu przy wyjściu z funkcji (dokładniej, gdy obiekt ONCLEANUP jest wyczyszczony z pamięci). Loren z MathWorks omawia to w jednym ze swoich postów na bloguTutaj . Jeśli umieścisz powyższy kod w funkcji, może on wyglądać mniej więcej tak:

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

Nawet jeśli wywołanie GETL wyrzuci wyjątek, obiekt ONCLEANUP nadal będzie czyszczony z pamięci na zwraca z funkcji load_line , zapewniając tym samym zamknięcie pliku.

 36
Author: gnovice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:02

Preferuję utworzenie klasy FileHandle z metodą delete, która zamyka plik, gdy obiekt wykracza poza zakres. Daje również możliwość wykonywania innych, bardziej naturalnych czynności związanych z obsługą plików.

 7
Author: Nzbuu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-26 19:29:47