Замечу, что никто не упомянул в своих ответах на этот старый вопрос, что снятие блокировки исключения является невероятно опасным делом. Да, операторы блокировки в C # имеют семантику «finally»; когда элемент управления выходит из замка нормально или ненормально, блокировка снимается. Вы все говорите об этом так, будто это хорошо, но это плохо! Правильный вариант, если у вас есть заблокированная область, которая вызывает необработанное исключение, - это завершить зараженный процесс непосредственно перед тем, как он уничтожит больше данных пользователя, а не освободить блокировку и продолжить работу em>.
Взгляните на это так: представьте, что у вас есть ванная с замком на двери и очередь людей, ожидающих снаружи. Бомба в ванной взорвалась, убив человека, находившегося там. Ваш вопрос: «Будет ли в этой ситуации замок автоматически разблокирован, чтобы следующий человек мог попасть в ванную комнату?» Да, это будет. Это нехорошо. Там просто взорвалась бомба и кого-то убили! Водопровод, вероятно, разрушен, дом больше не является прочным, и там может быть еще одна бомба. Правильнее всего будет вывести всех как можно быстрее и снести весь дом.
Я имею в виду, подумайте над этим: если вы заблокировали область кода, чтобы читать из структуры данных без ее изменения в другом потоке, и что-то в этой структуре данных вызвало исключение, шансы хорошие, что это потому, что структура данных повреждена. Пользовательские данные теперь испорчены; вы не хотите пытаться сохранить данные пользователя на этом этапе, потому что затем вы сохраняете поврежденные данные. Просто прекратите процесс.
Если вы заблокировали область кода, чтобы выполнить мутацию без одновременного чтения состояния другим потоком, и мутация выдает ошибку, то если данные не были повреждены раньше, это точно сейчас. Это именно тот сценарий, от которого предполагается защитить блокировку. Теперь коду, ожидающему чтения этого состояния, немедленно будет предоставлен доступ к поврежденному состоянию и, возможно, произойдет сбой. Опять же, правильное решение - прекратить процесс.
Как ни крути, исключение внутри блокировки - это плохие новости. Правильный вопрос - не «будет ли моя блокировка очищена в случае исключения?» Правильный вопрос: «Как мне убедиться, что внутри блокировки никогда не будет исключения? И если есть, то как мне структурировать свою программу, чтобы мутации возвращались к предыдущим хорошим состояниям?»
person
Eric Lippert
schedule
27.02.2012