Что такое ApplicationException для .NET? - PullRequest
156 голосов
/ 16 апреля 2011

Чтобы генерировать исключения, я обычно использую встроенные классы исключений, например ArgumentNullException и NotSupportedException. Однако иногда мне нужно использовать пользовательское исключение, и в этом случае я пишу:

class SlippedOnABananaException : Exception { }
class ChokedOnAnAppleException : Exception { }

и так далее. Затем я бросаю и ловлю их в своем коде. Но сегодня я наткнулся на класс ApplicationException - должен ли я использовать его вместо этого? Для чего это?

Кажется неэффективным иметь много эффективно идентичных классов Exception с разными именами (мне обычно не нужны какие-либо отдельные функции). Но мне не нравится идея перехвата универсального ApplicationException и необходимости использовать дополнительный код для определения ошибки.

Где должен ApplicationException соответствовать моему коду?

Ответы [ 3 ]

132 голосов
/ 16 апреля 2011

Краткий ответ: нигде.

Это пережиток прошлого, когда Microsoft намеревалась унаследовать все свои пользовательские исключения от ApplicationException.Вскоре после этого они передумали и сообщили, что пользовательские исключения должны быть производными от базового класса Exception.См. Рекомендации по обработке исключений в MSDN.

Одна из наиболее распространенных причин этого связана с выдержкой из Джеффри Рихтера из Руководства по разработке инфраструктуры :

System.ApplicationException - это класс, который не должен быть частью .NET Framework.Первоначальная идея заключалась в том, что классы, производные от SystemException , будут указывать исключения, выдаваемые самой CLR (или системой), тогда как исключения, не являющиеся CLR, будут производными от ApplicationException .Однако многие классы исключений не следовали этому шаблону.Например, TargetInvocationException (который генерируется CLR) является производным от ApplicationException .Таким образом, класс ApplicationException потерял всякий смысл.Причина для наследования этого базового класса состоит в том, чтобы позволить некоторому коду выше стека вызовов перехватывать базовый класс.Больше не было возможности отлавливать все исключения приложений.

Итак, у вас это есть.Суть в том, что ApplicationException не является вредным , просто бесполезным .

89 голосов
/ 16 апреля 2011

В соответствии с замечаниями в msdn:

Пользовательские приложения, а не общеязыковая среда выполнения, генерируют пользовательские исключения, полученные из класса ApplicationException.Класс ApplicationException различает исключения, определяемые приложениями, и исключения, определенные системой.

Если вы разрабатываете приложение, которое должно создавать свои собственные исключения, рекомендуется получить пользовательские исключения из класса Exception.Первоначально считалось, что пользовательские исключения должны быть производными от класса ApplicationException;однако на практике это не было найдено, чтобы добавить значительную ценность.Для получения дополнительной информации см. Рекомендации по обработке исключений.

Получите их из Exception.Кроме того, я не вижу проблемы с созданием новых исключений для ваших дел, если это оправдано.Если вы столкнулись со случаем, когда в фреймворке уже есть исключение, используйте его, иначе бросьте свой собственный.

19 голосов
/ 16 апреля 2011

В первоначальном проекте, в .NET 1.0, планировалось, что сам фреймворк выдаст SystemException и получит;в то время как пользовательские приложения - будут выбрасывать ApplicationException и производные.

Но позже, в .NET 2.0, это было отброшено.

Таким образом, производные от Exception.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...