Я зауважую, що ніхто у своїх відповідях на це старе запитання не згадував, що звільнення блокування за винятком є надзвичайно небезпечною справою. Так, оператори блокування в C # мають семантику "нарешті"; коли елемент керування виходить із блокування нормально або ненормально, замок звільняється. Ви всі говорите про це, ніби це добре, але це погано! Правильно зробити, якщо у вас є заблокована область, яка видає необроблене виняток, - це припинити процес захворювання, безпосередньо перед тим, як він знищить більше даних користувача , а не звільнити блокування і продовжувати рухатися .
Подивіться на це так: припустимо, у вас є ванна кімната із замком на дверях і черга людей, що чекають надворі. У ванній кімнаті вибухнула бомба, внаслідок якої загинула людина. Ваше запитання: "в такому випадку замок буде автоматично розблокований, щоб наступна людина могла потрапити у ванну?" Так це буде. Це не дуже добре. Щойно там вибухнула бомба і когось убила! Водопровід, ймовірно, зруйнований, будинок вже не має міцних конструкцій, і там може бути ще одна бомба . Правильно зробити , як можна швидше вивести всіх і знести весь будинок.
Я маю на увазі, продумайте: якщо ви заблокували область коду для читання зі структури даних, не мутуючи її в іншому потоці, і щось у цій структурі даних викликало виняток, хороші шанси, що це тому, що структура даних є корумпованим . Дані користувачів тепер переплутані; Ви не хочете намагатись зберегти дані користувача на даний момент, оскільки Ви потім зберігаєте пошкоджені дані. Просто припиніть процес.
Якщо ви заблокували область коду для того, щоб виконати мутацію без одночасного зчитування стану ще одним потоком, і мутація кидає, то якщо дані раніше не були пошкоджені, це впевнено, що зараз . Який саме сценарій, від якого повинен захищати замок . Тепер код, який очікує прочитати цей стан, негайно отримає доступ до пошкодженого стану і, можливо, сам вийде з ладу. Знову ж таки, правильно, що потрібно зробити - це припинити процес.
Як би ви не розрізали його, виняток всередині замку - це погана новина . Правильне запитання - це "чи не зачиститься мій замок у разі виключення?" Правильне запитання - "як мені забезпечити, щоб у замку ніколи не було винятків? А якщо є, то як я можу структурувати свою програму так, щоб мутації відкочувались до попередніх хороших станів?"