Подтвердить что ты не робот

Можно ли получить из System.ArgumentException?

Если у меня есть метод, который проверяет правильность его аргументов, можно ли оставить мои собственные пользовательские исключения, полученные из System.ArgumentException? Я спрашиваю, потому что ArgumentException сам получен из System.SystemException, и я вижу противоречивые рекомендации относительно того, должно ли приложение выводиться из SystemException. (Хотя косвенно, исходя из ArgumentException, все равно равнозначно выводу из SystemException.)

Я вижу множество рекомендаций, которые не выводятся из ApplicationException, но вместо этого выходят из Exception. Я доволен этим. Что я не уверен в том, можно ли также получить от SystemException тоже.

Если мне не следует выводить из SystemException, то что мне следует выводить из классов "invalid argument" исключений из?

4b9b3361

Ответ 1

Страница MSDN о рекомендациях по устранению исключений сообщает

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

Итак, я бы сказал, что это нормально и даже рекомендуется.

Ответ 2

Одним из преимуществ получения System.ArgumentException является то, что блоки catch(System.ArgumentException) смогут обрабатывать ваш собственный тип исключения, а также System.ArgumentException. Это может быть или не быть тем, что вы хотите.

Ответ 3

Если вы хотите получить исключения "недопустимый аргумент", и они не имеют значения, выходящих за рамки этого, то ArgumentException звучит как разумный кандидат:

ArgumentException вызывается при вызове метода и по крайней мере один из переданных аргументов не соответствует спецификации параметра вызываемого метода. - MSDN

Ответ 4

Исходная идея за исключением в .Net заключалась в том, что исключения в библиотеках базовых классов (например, сборки системы) будут генерировать исключения, полученные из System.Exception, и сообщают, что все пользовательские исключения наследуют от System.ApplicationException, чтобы различать исключения BCL и исключения приложений, однако Microsoft отступила от этой идеи и теперь предлагает, чтобы все исключения наследовались от System.Exception.

Мой совет - наследовать от самого низкого класса Exception в рамках, который имеет смысл.

Если ваше исключение означает что-то конкретное, кроме проблемы с этим аргументом, например. тип может добавить семантику в исключение (так же, как ArgumentNullException и ArgumentOutOfRangeException do), а затем создать пользовательский, если не тогда, просто используйте ArgumentException и поставьте осмысленное сообщение об исключении.

Ответ 5

Если вы на 100% повторно используете свойства ArgumentException и добавляете дополнительную функциональность, все будет хорошо. Однако, когда вы только повторно используете его из-за его имени, это будет не так.