2012-03-23 13 views
5

Escribí un programa simple para probar una teoría de que el bloque "finalmente" siempre se ejecutará sin importar qué. Pero, lo que estoy viendo de la siguiente PGM es que el control nunca parece entrar en el bloque final final.¿Por qué el "fin" externo no se ejecuta cuando se lanza el "catch" interno?

Intenté hacer F5 y también Ctrl-F5 en Visual Studio y es el mismo resultado.

¿Alguien puede explicar por qué estoy viendo este comportamiento?

de salida en la ventana de la consola es:

captura interior

interior finalmente

captura exterior

excepcion no controlada:

..y entonces la aplicación se bloquea

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

Respuesta

7

Se ejecuta "outer finally", justo después de que se maneja la excepción.

Aquí es el resultado de la ejecución de este código fuera del depurador:

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

Cuando se produjo la excepción se mostrará lo siguiente: Exception

Después hice clic en "Cancelar", la aplicación se reanuda y muestra el "exterior finalmente".

Si por alguna razón cierras tu aplicación antes de que tenga la oportunidad de ingresar al "exterior finalmente", nunca verás tu mensaje. Si el proceso de una aplicación se "cancela", se saltan las finales en caso de que contengan un código que impida el cierre de la aplicación. De lo contrario, puede ser imposible terminar ese proceso.

+0

oh ok. al hacer clic en cancelar, aparece la afirmación "exterior finally: bueno saber esto. Gracias – user330612

4

Es probable que la aplicación finalice antes de se vacía el búfer stdout.

Cualquiera de añadir un punto de ruptura en el exterior, por último (en el WriteLine) o lanzar una excepción diferente del exterior, por último confirmar. A finally es no omitido: ¡hacerlo sería un error grave!

+1

+1 o haga una tecla de lectura al final. – Craig

Cuestiones relacionadas