Noto che nessuno ha menzionato nelle risposte a questa vecchia domanda che rilasciare un blocco su un'eccezione è una cosa incredibilmente pericolosa da fare. Sì, le istruzioni lock in C # hanno la semantica "finalmente"; quando il controllo esce dalla serratura normalmente o in modo anomalo, la serratura viene rilasciata. Parlate tutti di questo come se fosse una buona cosa, ma è una brutta cosa! La cosa giusta da fare se si dispone di una regione bloccata che genera un'eccezione non gestita è terminare il processo malato immediatamente prima che distrugga più dati utente , non liberare il blocco e andare avanti .
Guardala in questo modo: supponi di avere un bagno con una serratura alla porta e una fila di persone che aspettano fuori. Una bomba nel bagno esplode uccidendo la persona lì dentro. La tua domanda è "in quella situazione il lucchetto verrà automaticamente sbloccato in modo che la prossima persona possa entrare in bagno?" Si lo farà. Non è una buona cosa. Una bomba è appena esplosa lì dentro e ha ucciso qualcuno! Probabilmente l'impianto idraulico è stato distrutto, la casa non è più strutturalmente solida e potrebbe esserci un'altra bomba . La cosa giusta da fare è far uscire tutti il prima possibile e demolire l'intera casa.
Voglio dire, pensaci bene: se hai bloccato una regione di codice per leggere da una struttura dati senza che venisse mutata su un altro thread, e qualcosa in quella struttura dati ha generato un'eccezione, le probabilità sono buone che sia perché la struttura dati è corrotto . I dati dell'utente sono ora incasinati; non vuoi provare a salvare i dati utente a questo punto perché stai salvando dati corrotti . Basta terminare il processo.
Se hai bloccato una regione di codice per eseguire una mutazione senza che un altro thread leggesse lo stato nello stesso momento e la mutazione genera, allora se i dati non erano corrotti prima, sicuramente lo è ora . Che è esattamente lo scenario da cui la serratura dovrebbe proteggersi . Ora il codice in attesa di leggere quello stato avrà immediatamente accesso allo stato danneggiato e probabilmente si bloccherà. Ancora una volta, la cosa giusta da fare è terminare il processo.
Non importa come lo tagli, un'eccezione all'interno di una serratura è una cattiva notizia . La domanda giusta da fare non è "la mia serratura verrà pulita in caso di eccezione?" La domanda giusta da porsi è "come posso assicurarmi che non ci sia mai un'eccezione all'interno di una serratura? E se c'è, allora come strutturo il mio programma in modo che le mutazioni vengano riportate agli stati buoni precedenti?"