2009-02-24 11 views

Respuesta

25

Suponiendo que el proceso no finaliza abruptamente (o cuelgue, por supuesto), el bloque finally siempre se ejecutará.

Si no hay un bloque final, la excepción del bloque catch simplemente se lanzará a la pila. Tenga en cuenta que la excepción original que causó la ejecución del bloque catch en primer lugar se perderá efectivamente.

excepciones de desbordamiento de pila

Como se señaló Jared, un desbordamiento de pila hará que el fin no bloque a ejecutar. Creo que esto termina el programa abruptamente, pero podría estar equivocado. Aquí está el código de ejemplo:

using System; 

public class Test 
{  
    static void Main() 
    { 
     // Give the stack something to munch on 
     int x = 10; 
     try 
     { 
      Main(); 
      Console.WriteLine(x); 
     } 
     finally 
     { 
      Console.WriteLine("Finally"); 
     } 
    } 
} 

Resultados:

proceso termina debido a StackOverflowException.

+2

creo una verdadera excepción de desbordamiento de pila también puede evitar que un fin que se ejecuten. Sin embargo, no puedo encontrar la documentación para esto. – JaredPar

+1

@Jared: Sí, creo que posiblemente tengas razón. ¿OutOfMemoryException también? No estoy seguro de eso. Intentare reproducir –

+1

¿Pero una StackOverflowException finaliza todo el proceso abruptamente? Si es así, viene bajo mi primer cheque. –

6

El bloque finally siempre se ejecutará. Si excluye el bloque finally y se produce una excepción dentro del bloque catch, no se ejecutará ningún código después del bloque catch, porque esencialmente su bloque catch fallará y generará una excepción no controlada.

6

Si no se ejecutará el fin siempre será ejecutar

Sin el código después de que el bloque catch.

Incluso con un bloque finally, no se ejecutará ningún código que siga al bloque finally.

+1

+1 para el código después de que finalmente no se ejecuta –

4

Si hay una excepción en el bloque catch, finalmente se ejecutará, pero se lanzará una nueva excepción. El bloque catch en el que se produjo la excepción no captará la excepción, continuará subiendo en la pila.

Lección aprendida: no hagas cosas en el bloque catch que puedas lanzar si puedes evitarlo; si es necesario, anide un bloque try/catch.

try 
{ 

} 
catch() 
{ 
    try 
    { 
    // code fails here 
    } 
    catch 
    { 
    // handle that. Or not. 
    } 
} 
finally 
{ 

} 
0

Si se produce una excepción en el bloque catch, todo el código finalmente se ejecutará. Si hay un manejador de excepciones más arriba en la pila (por ejemplo, llamante de esta función), detectará esta excepción. De lo contrario, se producirá una excepción no controlada y se reducirá la aplicación.

El código después del punto de excepción en el bloque catch no se llamará.

1

El bloque finally siempre se ejecutará.De MSDN:

El bloque finally es útil para limpiar los recursos asignados en el bloque try, así como ejecutar cualquier código que se debe ejecutar, incluso si no es una excepción. El control siempre pasa al bloque finally independientemente de cómo salga el bloque try.

Mientras que la captura se utiliza para controlar las excepciones que se producen en un bloque de instrucciones, por último se utiliza para garantizar un bloque de instrucciones de código se ejecuta independientemente de cómo se sale del bloque try anterior.

Por cierto, este es el tipo de pregunta que puede probarse fácilmente al escribir un código, compilarlo y ver qué sucede cuando lo ejecuta.

class Program { 
    static void Main(string[] args) { 
     try { 
      Console.WriteLine("Trying!"); 
      throw new Exception(); 
     } 
     catch (Exception e) { 
      Console.WriteLine("Catching {0}!", e.Message); 
      throw new Exception(); 
     } 
     finally { 
      Console.WriteLine("Finally!"); 
     } 
    } 
} 

Este salidas:

Trying!
Catching Exception of type 'System.Exception' was thrown.!

Unhandled Exception: System.Exception: Exception of type 'System.Exception' was
thrown.
at TestFinally.Program.Main(String[] args) in C:\Documents and Settings\Me\My
Documents\Visual Studio 2008\Projects\TestFinally\TestFinally\Program.cs:line 15
Finally!
Press any key to continue . . .

0

sólo quería añadir los casos yo sepa acerca de que no permitirá que el fin y cualquier otro bloque de código ejecutar:

  • En caso de un sistema StackOverflowException
  • tiempo de ejecución-lanzado. Environment.FastFail
  • Environment.Exit
  • Si un subproceso "de fondo" finaliza porque el programa principal al al que pertenece se está terminando.
  • un corte de corriente :)
Cuestiones relacionadas