Выдача исключения против проверки на ноль, для нулевого аргумента - PullRequest
5 голосов
/ 27 марта 2010

Какие факторы требуют выдачи исключения, если аргумент равен нулю (например, если (a равно нулю), генерировать новый ArgumentNullException ()), в отличие от проверки аргумента, если он равен нулю заранее.

Я не понимаю, почему следует генерировать исключение, а не проверять нулевое значение? Какая выгода в подходе исключения броска?

Это для C # /. NET

Спасибо

Ответы [ 5 ]

8 голосов
/ 27 марта 2010

Обычно выдается исключение ArgumentNullException, когда передается аргумент, значение которого равно нулю, но "никогда" не должно быть равно нулю. Это особое ArgumentException для работы с нулями.

Часто, если вы знаете, что получите нулевые значения в виде аргументов, вы проверяете нулевое значение и планируете остальную часть вашего метода соответственно - часто создавая записи, если их нет, или выполняя подпрограмму, отличную от ' мы запустились, если присутствовал правильный аргумент. В этом случае я обычно не использую ArgumentNullException, потому что планирую, чтобы значение NULL было допустимым.

Я использую ArgumentNullException, только когда я уверен, что что-то не должно быть нулевым, когда оно туда попадает, и я хочу записать аргумент, который определен как «недействительный».

5 голосов
/ 27 марта 2010

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

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

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

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

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

Резюме:
Если аргумент, установленный в null, является рутинным, и вызывающий метод должен быть написан для обработки возврата вашей функции без каких-либо действий, просто верните значение ошибки. Если нулевой аргумент встречается редко, и нельзя ожидать, что вызывающий метод будет обрабатывать ваш метод, ничего не делая, и выдается исключение, поэтому стек вызовов отменяется.

3 голосов
/ 27 марта 2010

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

ArgumentNullException очень полезно.

1 голос
/ 27 марта 2010

Как разработчик метода, вы должны решить, можете ли вы разумно сделать вывод , что вызывающий абонент имел в виду под null. Если можете, примите меры. Если вы не можете, наберите ArgumentNullException, чтобы сообщить вызывающему абоненту, что он дал вам значение, которое вы не можете использовать.

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

0 голосов
/ 27 марта 2010

Речь идет о принятии решения о контракте для вашего метода.Если вы хотите, чтобы контракт заключался в том, что вызывающие абоненты не должны передавать null, вы должны выбросить исключение, если вы его получите.Не доверяйте звонящему никогда не совершать эту ошибку!OTOH, если вы хотите, чтобы контракт не был настолько ограничительным в этом аргументе (что бы это ни значило; либо не делал ничего изящного, либо какое-либо другое поведение), тогда исключение явно неверно.

Что бы вы ни делали, документ это .Дайте бедному абоненту шанс сделать все правильно, прежде чем бросать вещи по вашему методу ...

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