entiendo cómo funciona la try-finallytry-catch funciona y cómo, pero me encuentro con ellos (por lo general) en dos escenarios completamente diferentes:Caso de uso de try-catch-finally tanto con la captura y finalmente
- try-finalmente (o
using
en C# y VB) se utiliza sobre todo en torno a algunos bloque de código de tamaño medio que utiliza algunos de los recursos que necesita ser dispuesto correctamente. - try-catch se utiliza sobre todo bien
- en torno a un solo estado que puede fallar de una manera muy específica o
- (como un cajón de sastre) a un muy alto nivel de la aplicación, por lo general directamente debajo de alguna acción de interfaz de usuario.
En mi experiencia, los casos en que un try-catch-finally sería apropiado, es decir, donde el bloque en el que yo quiero coger alguna excepción particular es exactamente el mismo bloque en el que Uso algún recurso desechable, son extremadamente raros. Sin embargo, los diseñadores de lenguaje de C#, VB y Java parecen considerar esto como un escenario muy común; los diseñadores de VB even think about adding catch to using
.
¿Echo de menos algo? ¿O soy demasiado pedante con mi uso restrictivo de try-catch?
EDIT: Para aclarar: Mi código por lo general se parece a esto (funciones desenrolladas para mayor claridad):
Try
do something
Aquire Resource (e.g. get DB connection)
Try
do something
Try
do something that can fail
Catch SomeException
handle expected error
do something else...
Finally
Close Resource (e.g. close DB connection)
do something
Catch all
handle unexpected errors
la que sólo parece tener mucho más sentido de poner cualquiera de los dos enganches de la misma nivel como finalmente solo para evitar la sangría.
¿De dónde sacó la sensación de que los diseñadores de idiomas lo consideran un escenario muy común? Es solo documentación, así que intentan escribir de una manera general; siempre usando try-catch-finally en los ejemplos –
No todos los idiomas lo hacen de esta manera. F # solo permite que cualquiera de los equivalentes pruebe o atrape finalmente, pero no try-catch-finally. – kvb
¿Su bloque "Catch All" libera el recurso? En caso afirmativo, lo tiene en dos lugares (vea el primero "finalmente"); de lo contrario, corre el riesgo de tener pérdidas de recursos. –