Observo que nadie ha mencionado en sus respuestas a esta vieja pregunta que liberar un candado en una excepción es algo increíblemente peligroso. Sí, las sentencias de bloqueo en C # tienen semántica "finalmente"; cuando el control sale de la cerradura de forma normal o anormal, la cerradura se libera. Todos están hablando de esto como si fuera algo bueno, ¡pero es algo malo! Lo correcto si tiene una región bloqueada que arroja una excepción no controlada es terminar el proceso enfermo inmediatamente antes de que destruya más datos de usuario , no liberar el bloqueo y continuar .
Mírelo de esta manera: suponga que tiene un baño con una cerradura en la puerta y una fila de gente esperando afuera. Una bomba estalla en el baño, matando a la persona que está allí. Su pregunta es "en esa situación, ¿se desbloqueará automáticamente la cerradura para que la siguiente persona pueda entrar al baño?" Sí, lo hará. Eso no es algo bueno. ¡Una bomba estalló allí y mató a alguien! Es probable que la tubería esté destruida, la casa ya no sea estructuralmente sólida y podría haber otra bomba allí . Lo correcto es sacar a todos lo más rápido posible y demoler toda la casa.
Quiero decir, piénselo bien: si bloqueó una región de código para leer desde una estructura de datos sin que se mute en otro hilo, y algo en esa estructura de datos arrojó una excepción, es muy probable que sea porque la estructura de datos está corrupto . Los datos del usuario ahora están desordenados; no desea intentar guardar datos de usuario en este momento porque luego está guardando datos corruptos . Simplemente finalice el proceso.
Si bloqueó una región de código para realizar una mutación sin que otro hilo leyera el estado al mismo tiempo, y la mutación se produce, entonces si los datos no estaban corruptos antes, seguro que lo están ahora . Cuál es exactamente el escenario contra el que se supone que protege la cerradura . Ahora, el código que está esperando leer ese estado tendrá acceso inmediato al estado corrupto y probablemente se bloqueará. Nuevamente, lo correcto es terminar el proceso.
No importa cómo lo corte, una excepción dentro de una cerradura es una mala noticia . La pregunta correcta no es "¿se limpiará mi cerradura en caso de una excepción?" La pregunta correcta es "¿cómo me aseguro de que nunca haya una excepción dentro de una cerradura? Y si la hay, ¿cómo puedo estructurar mi programa para que las mutaciones se reviertan a estados buenos anteriores?"