Como você lida com resources no MATLAB de maneira segura e sem exceções? (como “tente … finalmente”)

Como não há uma cláusula finally para o bloco try-catch no MATLAB, eu me vejo escrevendo muitos códigos como o seguinte:

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

Eu acho que ter a function fclose em dois lugares é feia e propensa a erros.

Existe uma maneira melhor de fazer isso?

Eu sugiro verificar objects ONCLEANUP . Eles permitem que você execute código automaticamente ao sair de uma function (mais especificamente, quando o object ONCLEANUP é limpo da memory). Loren do The MathWorks discute isso em um de seus posts aqui . Se você colocar o código acima em uma function, pode ser algo como isto:

 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 

Mesmo se a chamada para GETL lançar uma exceção, o object ONCLEANUP ainda será limpo da memory ao retornar da function load_line , garantindo assim que o arquivo seja fechado.

Minha preferência é criar uma class FileHandle com um método de delete que fecha o arquivo quando o object sai do escopo. Também lhe dá a oportunidade de fazer outras coisas mais naturais para lidar com arquivos.