2012-03-23 17 views
5

"Sonunda" bloğunun her zaman ne olursa olsun yürüteceği bir teoriyi test etmek için basit bir program yazdım. Ancak, aşağıdaki pgm'den gördüğüm şey, kontrolün dış final bloğuna hiçbir zaman girmediği.İç "yakalama" atarken dış neden "son" gerçekleştirilmez?

Visual Studio'da F5 ve Ctrl-F5 yapmayı denedim ve aynı sonucu verdi.

Birisi neden bu davranışı gördüğümü açıklayabilir mi? Konsol penceresinde

Çıktı geçerli:

iç yakalamak nihayet

dış mandalı

işlenmeyen exeption:

..ve sonra uygulama çöküyor

public class Program 
{ 
    static void Main() 
    { 
     try 
     { 
      try 
      { 
       string s = null; 
       s.ToString(); 
      } 
      catch 
      { 
       Console.WriteLine("inner catch"); 
       throw; 
      } 
      finally 
      { 
       Console.WriteLine("inner finally"); 
      } 

      return; 
     } 
     catch 
     { 
      Console.WriteLine("outer catch"); 
      throw; 
     } 
     finally 
     { 
      Console.WriteLine("outer finally"); 
     } 
    } 
} 

cevap

7

"Dış son", özel durum ele alındıktan hemen sonra çalıştırılır. İstisna şu görüntülendiği zaman gerçekleştiği

 
inner catch 
inner finally 
outer catch 

Unhandled Exception: System.NullReferenceException: Object reference not set to 
an instance of an object. 
    at SOConsole.Program.Main() in c:\Users\DaveShaw\Documents\Visual Studio 11\Pro 
jects\SO\SOConsole\Program.cs:line 35 
outer finally 
Press any key to continue . . . 

: Burada

debugger'ın dışında bu kodu çalıştırmasını çıkışı Exception

ben "İptal" tıklandığında sonra, uygulama yeniden başladı ve "dış son" görüntülendi.

Eğer herhangi bir nedenden ötürü “dış nihayet” e girme şansı olmadan başvurunuzu kapatırsanız, o zaman asla mesajınızı görmezsiniz. Bir uygulamanın süreci "sonlandırılırsa", uygulamanın kapanmasını engelleyen bir kod içermesi durumunda son olarak atlanır. Aksi halde bu süreci sonlandırmak imkansız olabilir.

+0

oh tamam. iptal üzerine tıklayarak "dış nihayet: deyim ortaya çıkar. Bunu bilmek güzel. Teşekkürler – user330612

4

Uygulama,'dan önce sonlandırılıyor, stdout tamponu temizlendi.

Ya dış nihayet (WriteLine üzerine) bir kırılma noktası eklemek veya onaylamak için dış nihayet bir farklı istisna. finally değil atlandı: bu yüzden ciddi bir hata olur!

+1

+1 veya sonunda bir readkey yapın. – Craig

İlgili konular