Parece que lo hace según algunas pruebas iniciales, pero lo que me gustaría saber es si es garantizado para devolver o si en algunos casos no puede devolver? Esto es crítico para mi aplicación, pero aún no he encontrado un caso de uso donde no vuelva.
Me gustaría obtener experiencia en el tema.Si regreso de un bloque try/finally en C# ¿el código finalmente se ejecuta?
Respuesta
Cualquier cosa en un bloque finally siempre se ejecutará independientemente de lo que ocurra dentro de los bloques try o catch. No importa si regresas del método o no.
La única excepción a esto es si el código en el bloque finally arroja una excepción, y luego dejará de ejecutarse como cualquier otro bloque de código.
En cuanto a goto, la respuesta es sí. Considere el siguiente código:
try
{
Console.WriteLine("Inside the Try");
goto MyLabel;
}
finally
{
Console.WriteLine("Inside the Finally");
}
MyLabel:
Console.WriteLine("After the Label");
La salida producida es la siguiente:
Dentro de la Trata
Dentro del último
Después de la etiqueta
En caso de Excepciones fatales que terminan la aplicación Finalmente el bloqueo no b e llamado. Incluye desbordamiento de pila, excepciones durante JIT de métodos para llamar, excepciones fatales insisde tiempo de ejecución de CLR.
Como @mintech señala si la aplicación se bloquea dentro del bloque, simplemente no llegará al bloque. Esto incluye la espera de objetos de sincronización, interbloqueos bucles infinitos o incluso interfaz de usuario que no tiene forma de cerrarlo.
Hay una serie de inexactitudes en las otras respuestas.
El control se pasa al bloque finally cuando el control sale del bloque try normalmente - es decir, mediante un retorno, goto, break, continue o simplemente cayendo del extremo. El control se pasa al bloque finally cuando el control abandona el bloque try a través de una excepción que ha sido capturada por un bloque catch catch.
En cualquier otra circunstancia no hay garantía que se llamará el código en el bloque finally. En particular:
Si el código de bloque try entra en un bucle infinito, o el hilo es congelado y nunca sin congelar, entonces el bloque finally código nunca es llamado.
Si el proceso se detiene en el depurador y luego se elimina agresivamente, entonces nunca se llama al bloque finally. Si el proceso falla, entonces nunca se llama al bloque finally.
Si el cable de alimentación se saca de la pared, entonces nunca se llama al bloque finally.
Si hay una excepción lanzada sin un bloque catch correspondiente continuación, si el bloque finally se ejecuta o no, es un detalle de implementación del tiempo de ejecución. El tiempo de ejecución puede elegir cualquier comportamiento cuando hay una excepción no detectada. Ambos "no ejecutan los bloques finally" y "do run the finally blocks" son ejemplos de "cualquier comportamiento", por lo que cualquiera puede ser elegido. Por lo general, lo que hace el tiempo de ejecución es preguntar al usuario si desea adjuntar un depurador antes de ejecutar finalmente los bloques; si el usuario dice que no, entonces los bloques finalmente se ejecutan. Pero otra vez: el tiempo de ejecución no es requiere para hacer eso. Podría simplemente fallar rápidamente.
No puede confiar en que finalmente se llamen siempre los bloques. Si necesita una gran garantía sobre la ejecución del código, entonces no debería estar escribiendo una prueba; por último, debe escribir una región de ejecución restringida. Escribir una CER correctamente es una de las tareas más difíciles en la programación C#, así que estudie la documentación cuidadosamente antes de intentar escribir el código.
Por cierto, un "hecho de la diversión" sobre GOTOS finalmente bloqueados-es:
try { goto X; } finally { throw y; }
X : Console.WriteLine("X");
X es una etiqueta inalcanzable targetted alcanzable por un Goto! Así que la próxima vez que estés en una fiesta puedes decir "oigan todos, ¿alguien puede hacer un programa de C# que tenga una etiqueta inalcanzable dirigida por un goto accesible?" y verá quién en la fiesta ha leído la especificación de alcance y quién no.
Agregaría errores: en tiempo de ejecución, sistema operativo, controladores, hardware, etc. que causaron BSOD o PC cuelga. –
@EricLippert Si se produce una excepción de OutmentMemory en try block, creo que finalmente no se ejecutará. ¿Estoy en lo correcto al asumir eso? Por favor hagamelo saber. – Sandeep
Así que la moraleja de la historia es: nunca invite a Eric Lippert a sus fiestas;) – Tergiver
Éstos son algunos ejemplos:
Environment.FailFast()
try
{
Console.WriteLine("Try");
Environment.FailFast("Test Fail");
}
catch (Exception)
{
Console.WriteLine("catch");
}
finally
{
Console.WriteLine("finally");
}
La salida es única "Prueba"
Stackoverflow
try
{
Console.WriteLine("Try");
Rec();
}
catch (Exception)
{
Console.WriteLine("catch");
}
finally
{
Console.WriteLine("finally");
}
¿Dónde está Rec:
private static void Rec()
{
Rec();
}
La salida sólo es "probar" y el proceso termina debido a StackOverflow.
excepción unhanded
try
{
Console.WriteLine("Try");
throw new Exception();
}
finally
{
Console.WriteLine("finally");
}
- 1. ¿El código finalmente se ejecuta después de un retorno en Objective-C?
- 2. Finalmente el bloque no se está ejecutando?
- 3. ¿El bloque C# "finally" SIEMPRE se ejecuta?
- 4. En Python, si regreso dentro de un bloque "con", ¿el archivo aún se cerrará?
- 5. ¿Se ejecuta finalmente un bloqueo incluso si lanza una nueva excepción?
- 6. ¿Por qué se ejecuta este "finalmente"?
- 7. Condiciones cuando finalmente no se ejecuta en un .net try ... bloque final
- 8. ¿Por qué mi bloque finalmente no funciona en C#?
- 9. finalmente bloquear en C#
- 10. En .NET, ¿qué pasa si algo falla en el bloque catch, finalmente siempre se llamará?
- 11. Manejo de excepciones: ¿Finalmente se ejecuta después del lanzamiento?
- 12. En Java, ¿se garantiza que se llamará el bloque "finalmente" (en el método principal)?
- 13. ¿Se ejecuta el código C más rápido?
- 14. ¿Se ejecutará finalmente el código después de una redirección?
- 15. pitón: recuperar excepción del bloque try, si finalmente el bloque plantea excepción
- 16. Comprobando si el código se ejecuta en modo de depuración
- 17. ¿Por qué finalmente el bloque se está ejecutando después de llamar a sys.exit (0) en el bloque except?
- 18. Ejecuta el código de C++ en línea?
- 19. ¿Es un bloque finalmente sin bloque de captura un antipatrón de Java?
- 20. Establecer referencia = nulo en bloque finalmente?
- 21. ¿Cómo se puede sincronizar fácilmente un bloque de código C#?
- 22. ¿Por qué mi código de gráficos no se ejecuta a menos que haya un System.out.println en el bloque de código?
- 23. ¿Qué sucede si un tiro? declaración se ejecuta fuera del bloque de captura?
- 24. Finalmente está "fuera del alcance" en un bloque try/catch
- 25. ¿Por qué el código en el bloque estático no se ejecuta?
- 26. orden de ejecución de try catch y finalmente bloque
- 27. C# Comprobar si se ejecuta como administrador
- 28. ¿Se ha ejecutado finalmente en este caso la ruptura de un bucle for de un bloque catch
- 29. Cómo comprobar si Google Test se ejecuta en mi código
- 30. ¿Cómo se ejecuta un bloque de JavaScript cargado dinámicamente?
Algunas excepciones no pueden ser capturados como un desbordamiento de pila. –
Consulte aquí: http://stackoverflow.com/a/50627/5190 –
¿Puede resolver su situación? Tenga en cuenta que un programa se puede cancelar por la fuerza. Del título, parece que estás preguntando si intentas {return; } finally {// mycode} ejecutará el código finalmente. La respuesta es no. –