2011-08-26 33 views
12

Bunlardan biri riskli midir? Biri daha mı iyi? Yoksa yazdırdığınız şeylerden biri mi ve karar vermek için bir dart atıyor mu?En sonunda dönüş ve karşı dönüş için geri dönün mü?

Ben nasıl çalıştığını nihayet anlıyorum şimdi yapmak istiyorum:

try { 
    stuff that changes something... 
} 
catch (System.Exception ex) { 
    something.worked = false; 
    something.err = ex.Message; 
} 
finally { 
    stuff.close(); 
    return something; 
} 

Ama gördüm:

try { 
    stuff that changes something... 
    return something; 
} 
catch (System.Exception ex) { 
    something.worked = false; 
    something.err = ex.Message; 
    return something; 
} 
finally { 
    stuff.close(); 
} 
+1

@Dlev - İlk hariç geçerli C# dışında, yapılamaz. Peki bu nasıl tercih edilebilir? Bu soru gerçekten tekrar sorulmalı, herhangi bir kodun aslında geçerli olduğu bir kod, aksi halde kendi türünde bir anlamsız. –

+0

@Ramhound Oops, eskiden yasal C# değil. İkincisi aslında sözdizimsel olarak geçerlidir. – dlev

cevap

17

Sen returnfinally öğrenebileceğinden. Sen derleyici hatası alırsınız:

Control cannot leave the body of a finally clause


hedef sınıfı IDisposable sonra ertesi yapacağını uyguluyorsa: Vasiyet eğer

using (stuff s = new stuff()) 
{ 
    return stuff; 
} 

veya

using (stuff s = new stuff()) 
{ 
    try 
    { 
     // do stuff 
     return stuff; 
    } 
    catch (Exception ex) 
    { 
     // do logging or another stuff 
     return something; 
    } 
} 

sizin için Dispose() arayacak gerekli/mümkün.

+0

Doh! Bir dahaki sefere sormadan önce derlemeyi dene, Self! Kontrolün nihayetinde bırakılamayacağı, nihayetinde dikkat çekiciliğinde bu kadar eşsiz olduğu anlamına gelir. – ChuckNeuros

+2

@ user540903: Evet, bunu derlemiş olmalısın. Ama kendini çok kötü vurma; Sonunda dönüşün yasal olduğu diller vardır ve bu diller sonuç olarak oldukça garip kontrol akışı anlamlarına sahiptir. Genel olarak makul bir soru, sadece C# için değil. –

+0

@Eric Ben oldukça Java bu dillerden biri. Hatırladığım kadarıyla, en son 'dönüş' daha önce yazılanların üzerine yazıyor, bu yüzden {try new BlahException(); } yakalamak {return 1; } sonunda {return 2; } 'aslında arayan kişiye' 2' döndürür. – dlev

17

Şahsen ne yapacağını ve onlar başarısız olmuş ise set/hiç açılmamış edilebileceği gibi nesnelerin/atmayın kapatmaya gerek olmadığını kontrol finally açıklamada Ayrıca


try { 
    stuff that changes something... 
} 
catch (System.Exception ex) { 
    something.worked = false; 
    something.err = ex.Message; 
} 
finally { 
    stuff.close();  
} 
return something; 

kullanmak.

Ayrıca ikinci yaklaşımda riski yoktur burada Is it bad practice to return from within a try catch finally block?

+1

Bu konuda hemfikirim, çünkü abatishchev sonunda geri dönemeyeceğinizi söylüyor, bir yakalamada dönüşünüz olduğunu düşünmüyorum. Eğer bir yakalama yakaladıysanız ve tekrar hareket ettirmiyorsanız, her iki şekilde geri dönmesini isteyin ve eğer tekrar hareket ederseniz, o zaman asla geri dönmeyecektir. Her iki durumda da sadece 1 return deyimine ihtiyacınız olmaz. 2 –

+1

denemeden/try/nihayetinden dönen "yapılandırılmış programlama" olarak kabul edilmez. Tim ve Ben'e katılıyorum. –

0

görüyoruz. Ancak istisnalar durumunda farklı değerler döndürmenizi sağlar.

+1

Yani, bir değişken döndürüyor ve bunu deneme ve yakalama bloklarındaki farklı değerlere ayarlıyor, ancak yalnızca 1 try/catach bloğu dışında geri dönüyor. Bir değişkenin değerini döndüren –

+0

, istisnalar durumunda farklı değerler döndürmenizi de sağlar. –

İlgili konular