Что такое ApplicationException для .NET?

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

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

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

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

Где ApplicationException вписывается в мой код?

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Но позже, в .NET 2.0, это было отключено.

Таким образом, получим Exception.