Чтобы генерировать исключения, я обычно использую встроенные классы исключений, например, ArgumentNullException
и NotSupportedException
. Однако иногда мне нужно использовать пользовательское исключение, и в этом случае я пишу:
class SlippedOnABananaException : Exception { }
class ChokedOnAnAppleException : Exception { }
и так далее. Затем я бросаю и ловлю их в своем коде. Но сегодня я наткнулся на ApplicationException
класс - должен ли я использовать это вместо этого? Для чего это?
Кажется неэффективным иметь множество эффективно идентичных классов исключений с разными именами (мне обычно не нужны какие-то отдельные функции). Но мне не нравится идея поймать универсальный ApplicationException
и использовать дополнительный код для определения ошибки.
Где должен ApplicationException
соответствовать мой код?
c#
.net
exception
exception-handling
Джеймс
источник
источник
Ответы:
Согласно замечаниям в MSDN:
Получите их от
Exception
. Кроме того, я не вижу проблемы с созданием новых исключений для ваших дел, если это оправдано. Если вы столкнетесь со случаем, когда в фреймворке уже есть исключение, используйте его, иначе бросьте свой собственный.источник
ApplicationException
это бесполезно и существует только из-за обратной совместимости?Краткий ответ: нигде.
Это пережиток прошлого, когда Microsoft планировала, что разработчики унаследуют все свои пользовательские исключения от ApplicationException. Вскоре после этого они передумали и сообщили, что пользовательские исключения должны быть производными от базового класса Exception. См. Рекомендации по обработке исключений в MSDN.
Одним из наиболее широко распространены причин этого исходит от отрывка из Джеффри Рихтер в Руководстве по проектированию рамочного :
Так что у вас есть это. Резюме заключается в том, что ApplicationException не является вредным , просто бесполезным .
источник
Whizbang
решит, что оно хочет иметь все свои исключения в некоторой общей иерархии, использованиеApplicationException
для этой цели действительно не даст никаких преимуществ по сравнению с использованием пользовательскогоWhizbangException
базового класса. Однако более серьезная проблема в иерархии исключений .netApplicationException
связана не с тем, а с тем, что не удалось разделить исключения по категориям, которые могут быть фатальными для приложений, фатальными для потоков и локальными проблемами, а также неспособностью значимые «составные» исключения.finally
блока, в то время как другое исключение ожидает,catch
блоки дальше в стеке вызовов должны быть запущены, если они соответствуют любому вложенному исключению, но оставляют другие исключения ожидающими, чтобы выйтиcatch
блок будет переходить к другомуcatch
блоку в пределах того жеtry
блока (если таковые были пригодны), и выходом изfinally
блока с какими - либо исключениями , ожидающих бы перейти к следующему внешнегоcatch
илиfinally
.В первоначальном проекте, в .NET 1.0, планировалось, что сама структура будет генерировать
SystemException
и получать; пока пользовательские приложения - скинутApplicationException
и выведут.Но позже, в .NET 2.0, это было отброшено.
Таким образом, производные от
Exception
.источник