Игнорировать исключение NullReferenceException при чтении свойств объекта

Есть ли способ заставить C# игнорировать NullReferenceException (или любое конкретное исключение в этом отношении) для набора операторов. Это полезно при попытке чтения свойств из десериализованного объекта, который может содержать много нулевых объектов. Наличие вспомогательного метода для проверки нулевого значения может быть одним из способов, но я ищу что-то близкое к «При ошибке возобновить следующее» (из VB) на уровне блока инструкций.

Обновлено: Try-Catch пропустит последующие утверждения при исключении

try
{
   stmt 1;// NullReferenceException here, will jump to catch - skipping stmt2 and stmt 3
   stmt 2;
   stmt 3;
}
catch (NullReferenceException) { }

Например: я десериализую XML-сообщение для объекта, а затем пытаюсь получить доступ к такому свойству, как

Message.instance[0].prop1.prop2.ID

теперь prop2 может быть нулевым объектом (потому что он не существует в сообщении XML - необязательном элементе в XSD). прямо сейчас мне нужно проверить значение null для каждого элемента в иерархии, прежде чем получить доступ к элементу листа. т.е. я должен проверить, не являются ли экземпляры [0], prop1, prop2 нулевыми, прежде чем обращаться к «ID».

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
7 519
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Короче: нет. Перед тем, как пытаться использовать ссылку, проверьте ее на нуль. Одним из полезных трюков здесь могут быть методы расширения C# 3.0 ... они позволяют по-видимому вызывать что-то по нулевой ссылке без ошибок:

string foo = null;
foo.Spooky();
...
public static void Spooky(this string bar) {
    Console.WriteLine("boo!");
}

Помимо этого - возможно, какое-то использование условного оператора?

string name = obj == null ? "" : obj.Name;
try
{
   // exceptions thrown here...
}
catch (NullReferenceException) { }

Тернарный оператор и / или ?? оператор может быть полезен.

Скажем, вы пытаетесь получить значение myItem.MyProperty.GetValue (), а MyProperty может иметь значение null, и вы хотите установить по умолчанию пустую строку:

string str = myItem.MyProperty == null ? "" : myItem.MyProperty.GetValue();

Или в случае, когда возвращаемое значение GetValue равно нулю, но вы хотите использовать что-то по умолчанию:

string str = myItem.MyProperty.GetValue() ?? "<Unknown>";

Это может быть объединено с:

string str = myItem.MyProperty == null 
    ? "" 
    : (myItem.MyProperty.GetValue()  ?? "<Unknown>");

Я бы выбрал вспомогательный метод. On Error Resume Next просто приводит к безумию.

Ответ принят как подходящий

теперь я использую делегат и обработку исключений NullReferenceException

public delegate string SD();//declare before class definition

string X = GetValue(() => Message.instance[0].prop1.prop2.ID); //usage

//GetValue defintion
private string GetValue(SD d){
        try
        {
            return d();
        }
        catch (NullReferenceException) {
            return "";
        }

    }

Благодаря Попробуйте поймать каждую строку кода без отдельных блоков try-catch за идею

Другие вопросы по теме