Должны ли когда-либо быть пойманы NullRefs? - PullRequest
4 голосов
/ 25 февраля 2009

Я недавно сделал заявление коллеге, что:

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

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

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

Ответы [ 6 ]

6 голосов
/ 25 февраля 2009

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

4 голосов
/ 25 февраля 2009

Может быть, правильная цитата

Исключения NullReferenceException никогда не должны быть явно пойманным , если у вас есть код который выкинул исключение

4 голосов
/ 25 февраля 2009

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

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

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

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

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

1 голос
/ 25 февраля 2009

Ты прав, "никогда" - это сильное слово.

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

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

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

0 голосов
/ 25 февраля 2009

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

0 голосов
/ 25 февраля 2009

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

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

...