Try/catch не ловит NullReferenceException, как исправить?

NullReferenceException является одной из наиболее распространенных ошибок, с которыми сталкиваются разработчики на языке программирования C#. Она возникает, когда в программе происходит попытка обращения к объекту, который имеет значение null, то есть не был инициализирован.

По умолчанию, try/catch конструкция предназначена для перехвата и обработки исключений, которые возникают в блоке кода, заключенном внутри try {} блока. Однако, NullReferenceException не является checked исключением, поэтому он не может быть перехвачен с помощью try/catch конструкции "из коробки". При попытке использовать try/catch для перехвата NullReferenceException, код в catch блоке просто не выполнится.

Тем не менее, существуют способы обойти это ограничение и обработать NullReferenceException.

1. Проверка на null перед обращением к объекту:

if (obj != null)
{
    // Выполнить какие-то действия с obj
}

Данный подход позволяет предотвратить возникновение NullReferenceException, проверяя объект на null перед его использованием.

2. Использование условного оператора null-объединения (??):

var result = obj?.SomeMethod() ?? DefaultValue;

В данном случае, если объект obj не равен null, будет вызван метод SomeMethod(). Если obj равен null, возвращается DefaultValue. Это позволяет избежать NullReferenceException и сделать код более читаемым.

3. Использование оператора условного null (?.):

var result = obj?.NestedObj?.SomeProperty;

В этом случае, если obj или NestedObj равны null, null будет присвоено переменной result, предотвращая возникновение NullReferenceException.

4. Использование оператора условного сопоставления (?.[]) в C# 6 и выше:

var length = obj?.Length ?? 0;

Если obj не равен null, будет вызван Length. В противном случае, вернется 0.

5. Использование блока try/catch внутри метода или выражения:

try
{
    // Ваш код, который может вызвать NullReferenceException
}
catch (NullReferenceException ex)
{
    // Вы можете обработать исключение здесь
}

Хотя try/catch сам по себе не будет перехватывать NullReferenceException, его можно использовать внутри методов или выражений для перехвата и обработки NullReferenceException.

При использовании любого из этих подходов, следует помнить, что лучший способ обработки NullReferenceException зависит от конкретной ситуации и требований вашего кода.