Примечание: это не дубликат вопроса Джеффа.
Этот вопрос спросил: "Это эквивалент?" Я знаю, что нет, и я хочу знать, почему!
Причина, по которой я спрашиваю, это то, что я только что понял, насколько это важно, и вывод кажется мне очень странным.
Блок обработки исключений Microsoft Enterprise Library рекомендует использовать этот шаблон:
catch (Exception x)
{
if (ExceptionPolicy.HandleException(x, ExceptionPolicies.MyPolicy))
throw;
// recover from x somehow
}
Политика определяется в XML файле, поэтому это означает, что если у клиента возникла проблема, мы можем изменить политику, чтобы помочь с отслеживанием (или, возможно, скреплением) проблемы, чтобы дать им быстрое разрешение, пока мы не справимся с ним должным образом - что может включать в себя споры с третьими сторонами, о чьей вине это все.
Это в основном признание простого факта, что в реальных приложениях количество исключений и их статус "восстановления" практически невозможно обойти без такого объекта.
Между тем команда CLR в MS говорит, что это не вариант, и, оказывается, эти ребята знают, о чем они говорят! Проблема заключается в том, что перед запуском блока catch выполняется выполнение любых блоков finally, вложенных в блок try. Таким образом, эти блоки finally могут выполнять любое из следующих действий:
- Безвредно изменить состояние программы (phew, lucky).
- Извлеките что-то важное в данных клиента, потому что состояние программы прикручено до неизвестной степени.
- Замаскируйте или уничтожьте важные доказательства того, что нам нужно диагностировать проблему, особенно если мы говорим о вызовах в собственный код.
- Бросьте еще одно исключение, добавив к общей путанице и страданиям.
Обратите внимание, что дескрипторы using и деструкторы С++/CLI построены на try/finally, поэтому они также затронуты.
Таким образом, шаблон catch/throw для фильтрации исключений не является хорошим. Фактически необходим способ фильтрации исключений посредством политики без их улавливания и, таким образом, запуска выполнения блоков finally, если мы не найдем политику, которая говорит нам, что исключение безопасно восстанавливать.
Команда CLR сообщила об этом недавно:
В результате мы должны написать вспомогательную функцию в VB.NET, чтобы позволить нам получить доступ к этой жизненно важной возможности из С#. Большая проблема в том, что есть проблема в том, что в BCL есть код, который делает это. Многие люди писали об этом, но редко упоминают о блоках try/finally, которые являются убийцами.
Что я хотел бы знать:
- Есть ли публичные заявления или прямые письма, которые люди получили от команды С# по этому вопросу?
- Есть ли какие-либо предложения Microsoft Connect, требующие этого? Я слышал слухи о них, но ни один из вероятных ключевых слов не появился.
Обновление:, как указано выше, я уже искал в Microsoft Connect, ничего не обнаружив. У меня также (неудивительно) Googled. Я только нашел людей объясняя, зачем им нужна эта функция или указывая преимущества этого в VB.NET или бесплодно надеясь, что он будет добавлен в будущую версию С#, или обходится вокруг, и много вводящие в заблуждение советы, Но никаких утверждений об обосновании отказа от нее из всех текущих версий С#. И причина, по которой я спрашиваю о существующих проблемах Connect, заключается в том, что (а) я не создаю ненужный дубликат и (б) я могу рассказать заинтересованным лицам, если мне нужно его создать.
Обновление 2: найдено интересное старое сообщение в блоге от Эрика Гуннерсона, ранее из команды С#:
"Да, возможность поставить условие на улов несколько более удобен чем писать тест самостоятельно, но это действительно не позволяет вы должны сделать что-нибудь новое".
Это было то же самое предположение, что и у меня, до тех пор, пока оно не было должным образом объяснено мне.