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?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.
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.
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