Должны ли 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. Честно говоря, это было плохо и непослушно, но это избавило меня от написания большого количества кода.