Получать из ApplicationException или нет? - PullRequest
0 голосов
/ 20 декабря 2018

Я не понимаю, когда использовать ApplicationException .На странице указано

Служит базовым классом для исключений, определенных приложением.

, а на этой же странице появляется следующее предупреждение

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

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

В нашем приложении мы хотим отлавливать все определенные приложением исключения и обрабатывать их иначе, чем исключения из самого .net.Следовательно, мы ловим общее исключение, из которого происходят все определенные приложением исключения.

Поэтому вместо выполнения

catch(AppCustomException ex) { ... }
catch(AnotherAppCustomException ex) { ... }
catch(YetAnotherAppCustomException ex) { ... }

мы имеем

catch(BaseCustomException ex) { ... } //All app custom exceptions derive from this type

Я думал, что это будетхорошо, если в этом примере в качестве основы для всех определенных пользователем исключений определено исключение ApplicationException вместо BaseCustomException.

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

Так что я сейчас растерялся.Какова цель ApplicationException на самом деле?

1 Ответ

0 голосов
/ 20 декабря 2018

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

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

Возьмите список исключений, которые происходят из ApplicationException на странице документации, которую выопубликовал ссылку на.

 Microsoft.JScript.BreakOutOfFinally
 Microsoft.JScript.ContinueOutOfFinally 
 Microsoft.JScript.JScriptException 
 Microsoft.JScript.NoContextException
 Microsoft.JScript.ReturnOutOfFinally
 System.Reflection.InvalidFilterCriteriaException
 System.Reflection.TargetException
 System.Reflection.TargetInvocationException
 System.Reflection.TargetParameterCountException
 System.Threading.WaitHandleCannotBeOpenedException

И список даже не полный, так как есть другие: DataSourceSerializationException, AppConfigException, NameValidationException и другие ...

Так что всякий раз, когдаодин из них будет сгенерирован, он попадет на ваш catch (ApplicationException exception), пока вы ожидаете исключения из вашего кода .

Я настоятельно рекомендую продолжить использование вашего пользовательского базового исключения.

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