¿Hay situaciones en las que sea apropiado utilizar un bloque try-finally
sin un bloque catch
?Utilice un bloque 'try-finally' sin un bloque 'catch'
Respuesta
Lo utilizará para asegurarse de que se realicen algunas acciones después del contenido try
o de una excepción, pero cuando no desee consumir esa excepción.
Para que quede claro, esto no oculta las excepciones. El bloque finally
se ejecuta antes de que la excepción se propague por la pila de llamadas.
También lo usaría inadvertidamente cuando use la palabra clave using
, porque esto se compila en un try-finally
(no es una conversión exacta, pero por razones de argumento está lo suficientemente cerca).
try
{
TrySomeCodeThatMightException();
}
finally
{
CleanupEvenOnFailure();
}
código que se ejecuta en finally
no se garantiza la ejecución, sin embargo, el caso en el que no se garantiza es bastante borde - no puedo ni siquiera recuerdo. Todo lo que recuerdo es que, si estás en ese caso, es muy probable que no ejecutar el finally
no sea tu mayor problema :-) así que básicamente no te preocupes.
Actualización de Tobias:finally
no se ejecutará si el proceso se cancela.
actualización de arroz:Conditions when finally does not execute in a .net try..finally block
El ejemplo más frecuente es posible que vea es disponer de una conexión de base de datos o recursos externos, incluso si el código falla:
using (var conn = new SqlConnection("")) // Ignore the fact we likely use ORM ;-)
{
// Do stuff.
}
compila en algo como :
SqlConnection conn;
try
{
conn = new SqlConnection("");
// Do stuff.
}
finally
{
if (conn != null)
conn.Dispose();
}
+1 para el ejemplo de código. –
¿Hay alguna buena razón para hacer esto? ¿Es una excepción ocultar prácticas no muy malas? – AnthonyBlake
@AnthonyBlake La excepción no está oculta. Si se produce una excepción, ejecutará finalmente y luego propagará la excepción a la pila de llamadas. –
Necesita un bloque finally, cuando no importa qué excepciones (si las hay) se capturan o incluso si no se captura ninguna, aún desea ejecutar algún código antes de que salga el bloque. Por ejemplo, es posible que desee cerrar un archivo abierto.
Ver también try-finally
try/finally: cuando no se quiere manejar las excepciones, pero quiere asegurarse de alguna acción (s) se produzca o no una excepción es lanzada por el código de llamada.
using
es equivalente a try-finally
. Solo usará try-finally
cuando desee hacer una limpieza dentro de finally
y no le importa la excepción.
El mejor enfoque habrá
try
{
using(resource)
{
//Do something here
}
}catch(Exception)
{
//Handle Error
}
Si lo hace, incluso limpiar llamado por using
falla, su código no fallará.
Hay algunas condiciones cuando finally
no se ejecutarán.
- Si hay
StackOverflowException
oExecutingEngineException
. - El proceso se elimina de una fuente externa.
Espero que esto responda a su duda.
Si tiene, por ejemplo, un recurso no administrado que crea y usa en el bloque try, puede usar el bloque finally para asegurarse de liberar ese recurso. El bloque finally siempre se ejecutará a pesar de lo que suceda (por ejemplo, excepciones) en el bloque try.
E.g. la cerradura (x) declaración es realmente:
System.Threading.Monitor.Enter(x);
try { ... }
finally
{
System.Threading.Monitor.Exit(x);
}
El bloque finally siempre se llamará para asegurar el bloqueo exclusivo se libera.
Tenga una mirada en el siguiente enlace: https://softwareengineering.stackexchange.com/questions/131397/why-use-try-finally-without-a-catch-clause
Depende de la arquitectura de su aplicación y la operación que está realizando en el bloque.
No sé nada de C#, pero parece que cualquier cosa que pudieras hacer con una prueba, finalmente, podrías hacer más elegantemente con un using statement. C++ ni siquiera tiene un finalmente como a result of its RAII.
Buena Explicación mediante código:
void MyMethod1()
{
try
{
MyMethod2();
MyMethod3();
}
catch(Exception e)
{
//do something with the exception
}
}
void MyMethod2()
{
try
{
//perform actions that need cleaning up
}
finally
{
//clean up
}
}
void MyMethod3()
{
//do something
}
Si bien MyMethod2 o MyMethod3 genera una excepción, será capturado por MyMethod1. Sin embargo, el código en MyMethod2 necesita ejecutar un código de limpieza, p. cerrar una conexión de base de datos, antes de que la excepción se pase a MyMethod1.
Un ejemplo de esta "limpieza" podría ser saveLogFile(), que a menudo quiero poner al final de un programa pase lo que pase. – Vincent
Aquí es un caso de uso que siempre (uhm ..) utilizo:
int? x; //note the nullable type here!
try
{
x = int.Parse(someString);
}
catch { } //don't care, let it just be null
Aquí es una situación en la que es posible que desee utilizar finalmente probar: cuando normalmente se utiliza un uso declaración, pero no puede porque está llamando a un método por reflexión.
Esto no funcionará
using (objMsg = Activator.CreateInstance(TypeAssist.GetTypeFromTypeName("omApp.MessagingBO")))
{
}
en lugar de utilizar
object objMsg = null;
try
{
objMsg
= Activator.CreateInstance(TypeAssist.GetTypeFromTypeName("myAssembly.objBO"));
strResponse = (string)objMsg.GetType().InvokeMember("MyMethod", BindingFlags.Public
| BindingFlags.Instance | BindingFlags.InvokeMethod, null, objMsg,
new object[] { vxmlRequest.OuterXml });
}
finally
{
if (objMsg!=null)
((IDisposable)objMsg).Dispose();
}
1. Podemos utilizar el bloque try sin capturas pero debe utilizar el catch/finally, cualquiera de ellos. 2. No podemos usar solo try block.
- 1. esperan en bloque catch
- 2. bloque catch error no requerían
- 3. costo de rendimiento de un bloque try/catch
- 4. ¿Es un bloque finalmente sin bloque de captura un antipatrón de Java?
- 5. Depuración de una excepción en un bloque catch vacío
- 6. ¿Cómo obtengo una variable de un bloque try/catch?
- 7. Envolviendo un servicio web en el bloque try/catch
- 8. ¿Cómo puedo determinar la excepción actual en un bloque catch (...)?
- 9. Finalmente está "fuera del alcance" en un bloque try/catch
- 10. ¿Por qué 'usar' no tiene un bloque catch?
- 11. ¿La colocación de un bloque try-catch afecta el rendimiento?
- 12. Ruby: bloque de rendimiento de un bloque?
- 13. Varios bloques try-catch CONTRA un bloque try-catch grande [en un hilo]
- 14. awk: catch `exit 'en el bloque END
- 15. Código completo en el bloque try/catch
- 16. Obteniendo la traza inversa del bloque catch
- 17. ¿Puedo evitar tal intento engorroso ... bloque catch
- 18. tiro nueva excepción vs bloque Catch
- 19. Tener un bloque/comando de Ruby falla silenciosamente sin un bloque de 'rescate' en blanco
- 20. ¿Realmente puede tener una función/método sin cuerpo pero solo un bloque try/catch?
- 21. ¿Qué significa en .Net: bloque try-catch sin ninguna excepción como parámetro para catch?
- 22. Cómo liberar un bloque
- 23. Asignando un campo final en un bloque try-catch dentro de un constructor
- 24. Python "esperaba un bloque sangrado"
- 25. ¿Bloque en línea sin márgenes?
- 26. Ceder en un bloque anónimo
- 27. IndentationError espera un bloque sangrado
- 28. ¿Debo copiar un bloque aquí?
- 29. Bajo C# cuánto de un impacto en el rendimiento es un intento, lanzar y bloque catch
- 30. ¿Debo usar un bloque try..catch y una reversión explícita en un procedimiento de SQL Server?
En MSDN, consulte [try-finally (Referencia C#)] (https://msdn.microsoft.com/en-us/library/zwc8s4fz%28v=vs.140%29.aspx). Tenga en cuenta que el artículo se refiere al uso combinado de 'try' y' finally' como la declaración ** ** try-finally ** * *. – DavidRR