Можете ли вы захватить имя объекта, который выбрасывает исключение NullReferenceException? - PullRequest
1 голос
/ 29 марта 2019

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

Что если исключение было сгенерировано в производственном коде, поэтому вы не можете запустить отладчик для проверки переменных? Сообщение об исключении показывает трассировку стека, поэтому вы можете увидеть, в какой метод было сгенерировано исключение, но не указано, какой именно объект был null.

Я хотел бы иметь возможность добавить имя объекта, которое было null, к сообщению об ошибке, чтобы при просмотре отчетов от пользователей и при обнаружении NullReferenceException я мог легко видеть какой объект был null и починить его. Кто-нибудь знает способ сделать это?

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

Редактировать : Вопрос о том, что это помечено как дубликат, действительно является дубликатом, но также очень стар (2008). С тех пор что-нибудь изменилось?

Редактировать 2 : Я нашел это , когда гуглил этот вопрос. Visual Studio может сказать вам, что бросил NullReferenceException; Есть ли способ нажать на это, чтобы добавить его в файл журнала?

1 Ответ

3 голосов
/ 29 марта 2019

Это должно быть относительно легко выяснить, учитывая трассировку стека, но лучшим подходом было бы включить «проверку» или параметры и / или нулевые проверки в ваш код и явно выдать ArgumentNullException самостоятельно, прежде чем пытаться получить доступ к член переменной, которая, возможно, не была инициализирована. Затем вы можете указать имя неинициализированного объекта:

if (obj == null)
    throw new ArgumentNullException(nameof(obj));

Обычной практикой является выполнение этих проверок аргументов как в конструкторах, так и в методах, например:

public void SomeMethod(SomeType someArgument)
{
    if (someArgument == null)
        throw new ArgumentNullException(nameof(someArgument));

    //you will never get there if someArgument is null...
    var someThing = someArgument.SomeMember;

    if (someThing == null)
       throw new ArgumentException("SomeMember cannot be null.", nameof(someArgument));
    ...
}
...