Во-первых, абсолютно существуют ситуации, когда лучше не ловить исключение.
Иногда исключение может иногда указывать, что ваша программа находится в неизвестном состоянии. Есть ряд исключений, где это в значительной степени истинно, учитывая тип исключения. NullReferenceException
по существу говорит вам "есть ошибка". И, поймав такое исключение, вы можете скрыть ошибку, которая звучит хорошо в краткосрочной перспективе, но в долгосрочной перспективе вам будет легче ее исправить. Продукт может не аварийно завершиться, но, безусловно, не будет иметь ожидаемого поведения.
Но это также верно для типов исключений, которые мы изобретаем для себя. Иногда тот факт, что исключение A было сгенерировано, должен быть «невозможным» - и все же это произошло, поэтому есть ошибка.
Кроме того, происходит нечто очень важное, когда вы перехватываете исключение: будут выполняться блоки finally
для всего стека вызовов внутри блока try (и всего, что он вызывает). Что делают эти блоки в конце концов? Ну ничего. И если программа находится в неизвестном состоянии, я действительно имею в виду что-нибудь . Они могут стереть ценные данные клиентов с диска. Они могут бросить больше исключений. Они могут повредить данные в памяти, делая невозможным диагностирование ошибки.
Поэтому, когда исключение указывает на неизвестное состояние, вы больше не хотите запускать код, поэтому, что бы вы ни делали, не перехватывает исключение . Пусть он пролетит мимо, и ваша программа будет безопасно завершена, и отчеты об ошибках Windows смогут зафиксировать состояние программы, как это было, когда проблема была первоначально обнаружена. Если вы поймаете исключение, вы запустите больше кода, что еще больше испортит состояние программы.
Во-вторых, вы должны выбросить исключение, зная, что оно не будет поймано? Я думаю, что этот вопрос неправильно понимает природу методов многократного использования. Вся идея метода заключается в том, что он имеет «контракт», который следует: он принимает определенные параметры и возвращает определенное значение, а также выдает определенные исключения при определенных условиях. Это контракт - звонящий сам решает, что с ним делать. Для некоторых абонентов исключение A может указывать на восстанавливаемое условие. Для других абонентов это может указывать на ошибку. И из того, что я сказал выше, должно быть ясно, что если исключение указывает на ошибку, оно не должно быть поймано .
И если вам интересно, что это значит для блока обработки исключений Microsoft Enterprise Library : да, он довольно сломан. Они сообщают вам catch (Exception x)
, а затем решают, следует ли свергнуть, основываясь на вашей политике; слишком поздно - блоки finally
к этому моменту уже выполнены. Не делай этого.