2009-07-08 19 views
29

MATLAB'daki try-catch bloğunun son cümlesi olmadığından, kendimi aşağıdaki gibi bir çok kod yazarken buluyorum:MATLAB'daki kaynakları özel durum güvenli bir şekilde nasıl ele alırsınız? ("... son olarak dene" gibi)

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

İki yerde fclose işlevini çirkin ve hataya eğilimli olarak buluyorum.

Bunu yapmak için daha iyi bir yolu var mı?

+3

Bu sadece küçük bir noktadır, ancak kodunuzdaki "line" değişken adını kullanmamanızı öneririm. LINE diye adlandırılan bir yerleşik fonksiyon olduğundan, bazı karışıklığa neden olabilir. – gnovice

+0

Ayrıca http://stackoverflow.com/questions/8847866/how-can-i-close-files-that-are-left-open-after-an-error adresini ziyaret edin –

cevap

35

ONCLEANUP nesnelerini incelemeyi öneririm. Bir işlevden çıkışta otomatik olarak kod çalıştırmanıza izin verir (daha özel olarak, ONCLEANUP nesnesi bellekten temizlendiğinde). Loren from The MathWorks bunu blog gönderileri here'dan birinde tartışır. Eğer bir işlevde, yukarıdaki kod yerleştirirseniz, böyle görünebilir:

Getl çağrısı bir istisna atar bile
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 

, ONCLEANUP nesne hala işlev load_line dönüşünde bellekten silinir, böylece dosyanın kapanmasını sağlar.

+2

Teşekkürler. Tam olarak aradığım şey bu. Genelde Matlab'daki onCleanup ve yeni stil sınıfları hakkında biraz daha fazla okuma yaptım ve bana göre, artık sınıflarda, Matlab'da uygun RAII'yi harika bir şekilde uygulayabiliyorsunuz. – snth

+0

onCleanup, ilk olarak MATLAB 7.6'da (R2008a) tanıtıldı. Eski sürümlerle (özellikle R2006b) uyumluluğu sürdürmek zorunda olan kişiler için ne önerirsiniz? – rob

+1

@rob: Kullanıcılara yazılımlarının 7 yılını geçmiş olmasına izin vermemelarını öneriyorum. ;) Ciddi cevap: R2006b nesne yönelimli programlamaya izin verdiğinden, [Nzbuu'nun cevabı] (http://stackoverflow.com/a/ adresinde önerildiği gibi) G/Ç dosyasını işlemek için bir sınıf yapmak benim yolumdur. 9024064/52738) ve [bu konuyla ilgili soruların] yanıtları (http://stackoverflow.com/q/8847866/52738). – gnovice

7

Tercihim, nesne kapsam dışına çıktığında dosyayı kapatan bir delete yöntemiyle FileHandle sınıfı oluşturmaktır. Ayrıca size daha doğal bir dosya tanıtımı yapma şansı verir.

+0

Daha fazla açıklama burada - http://stackoverflow.com/questions/8847866/how-can-i-close-files-that-are-left-open-after-an-error –

+0

Hey! Bu benim fikrim;) – Nzbuu

İlgili konular