Можно ли получить из System.ArgumentException?
Если у меня есть метод, который проверяет правильность его аргументов, можно ли оставить мои собственные пользовательские исключения, полученные из System.ArgumentException
? Я спрашиваю, потому что ArgumentException
сам получен из System.SystemException
, и я вижу противоречивые рекомендации относительно того, должно ли приложение выводиться из SystemException
. (Хотя косвенно, исходя из ArgumentException
, все равно равнозначно выводу из SystemException
.)
Я вижу множество рекомендаций, которые не выводятся из ApplicationException
, но вместо этого выходят из Exception. Я доволен этим. Что я не уверен в том, можно ли также получить от SystemException тоже.
Если мне не следует выводить из SystemException
, то что мне следует выводить из классов "invalid argument"
исключений из?
Ответы
Ответ 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 и добавляете дополнительную функциональность, все будет хорошо. Однако, когда вы только повторно используете его из-за его имени, это будет не так.