2012-03-23 9 views
5

Ho scritto un semplice programma per testare una teoria secondo cui il blocco "finally" verrà sempre eseguito indipendentemente da cosa. Ma quello che vedo dal basso pgm è che il controllo non sembra mai entrare nel blocco finale esterno.Perché l'esterno "finalmente" non viene eseguito quando vengono lanciati tiri interni?

Ho provato a fare F5 e anche Ctrl-F5 in Visual Studio ed è lo stesso risultato.

Qualcuno può spiegare perché sto vedendo questo comportamento?

uscita sulla finestra della console è:

cattura interna

interiore finalmente

cattura esterno

exeption non gestita:

..e poi l'applicazione si blocca

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

risposta

7

Il "esterno finalmente" viene eseguito, subito dopo l'eccezione viene gestita.

Ecco l'output di eseguire il codice al di fuori del debugger:

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

Quando si è verificata l'eccezione è stata visualizzata la seguente: Exception

Dopo aver cliccato su "Annulla", l'applicazione riprende e visualizzato "l'esterno finalmente".

Se per qualche ragione chiudi la tua applicazione prima che abbia la possibilità di entrare in "esterno alla fine", non vedrai mai il tuo messaggio. Se il processo di un'applicazione viene "terminato", gli ultimi vengono saltati nel caso in cui contengano codice che impedisce la chiusura dell'applicazione. Altrimenti potrebbe essere impossibile terminare tale processo.

+0

oh ok. Cliccando su cancella appare la scritta "esterno alla fine": buono a sapersi questo grazie – user330612

4

L'applicazione sta probabilmente terminando prima del il buffer stdout viene svuotato.

O aggiungere un break-point per l'esterno, infine, (sul WriteLine) o gettare una diversa un'eccezione dal esterno, infine, per confermare. A finally è non saltato: fare così sarebbe un bug serio!

+1

+1 o fare un readkey alla fine. – Craig

Problemi correlati