Должны ли NullRefs быть пойманы?

Недавно я сделал выражение коллеге, что:

NullReferenceExceptions никогда не должен быть явно пойманным

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

Никогда не бывает такого сильного слова.....

Ответ 1

Это зависит от того, почему; см. Eric Lippert запись в блоге. Если они являются "заостренными исключениями", то нет - просто исправьте вызывающий код. В редком случае, что они являются "неприятными исключениями" (т.е. Код, который вы вызываете, имеет ловушки, которых трудно избежать), тогда, я думаю, вам придется.

Ответ 2

Ну, когда вы вызываете в баггию стороннюю библиотеку, которая ocasionnaly вызывает nullrefs, вероятно, хорошая идея поймать их, если вы знаете, как правильно справляться с ними.

Пример реальной жизни: Раньше я довольно часто использовал datagrid, предоставляемый сторонним редактором. У них есть (или были в это время) подтвержденная ошибка, которая может отбрасывать nullref (вложенную глубоко в стек вызовов) от времени к времени при обновлении некоторых данных в базовом источнике данных.

Я рассмотрел ситуацию с этим кодом:

            try
            {
                // do the update
            }
            catch (NullReferenceException)
            {
                try
                {
                    // redo the update
                }
                catch (NullReferenceException ex)
                {
                    // properly log the third party lib failure
                }
            }

Btw, мой код "log" никогда не выполнялся через 2 года:) Теперь сторонний редактор исправил эту проблему, и мне, вероятно, следует удалить этот код.

Ответ 3

Возможно, правильная цитата

NullReferenceExceptions никогда не должен быть явно пойманным , если вы владеете код, который выбрал Exception

Ответ 4

Вы правы, "никогда" не является сильным словом.

Захват исключения NullReferenceException (или NPE для Java) всегда будет зависеть от цели кода.

Например, если ваше приложение ТРЕБУЕТСЯ, что обработка продолжается даже с потенциально неопределенным состоянием (подумайте о системах жизнеобеспечения) или если ваш код не заботится о состоянии ссылочного объекта (например: данные пакетной обработки, которые выбрасывают, буквально, плохие данные).

Это хорошее эмпирическое правило, чтобы не перехватывать эти типы исключений, но не закон.

Ответ 5

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

Как отмечает Марк Гравелл, у Эрика Липперта очень хорошая запись в блоге об исключениях.

Ответ 6

Мне когда-то приходилось строить большую строку на основе значений 15 или около того переменных. Вместо того, чтобы проверять каждый из них на nullness, я просто продолжал и создавал строку, разыменовывая переменные и захватывая NRE. Честно говоря, это было плохо и непослушно, но это избавило меня от написания большого количества кода.