Пойманное исключение само по себе является нулевым! - PullRequest
32 голосов
/ 12 апреля 2011

У меня есть приложения ASP.NET.Все было хорошо, но недавно я получаю исключения, которые сами по себе равны нулю:

try
{
    // do something
}
catch (Exception ex)
{
    Logger.Log("Error while tried to do something. Error: " + ex.Message);
}

Иногда ex само по себе null!

Есть идеи?

Ответы [ 5 ]

45 голосов
/ 12 января 2015

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

Сломано:

try
{
    // do something
}
catch (WebException ex) // <- both variables are named 'ex'
{
    Logger.Log("Error while tried to do something. Error: " + ex.Message);
}
catch (Exception ex) // <- this 'ex' is null
{
    Logger.Log("Error while tried to do something. Error: " + ex.Message);
}

Решение состоит в том, чтобы по-разному называть переменные исключения.

Исправлено:

try
{
    // do something
}
catch (WebException webEx) // <- all good in the hood
{
    Logger.Log("Error while tried to do something. Error: " + webEx.Message); // <-
}
catch (Exception ex) // <- this 'ex' correctly contains the exception
{
    Logger.Log("Error while tried to do something. Error: " + ex.Message);
}
5 голосов
/ 12 июля 2016

В моем случае причиной была исключительная ситуация StackOverflowException.Такие исключения обычно вообще не достигают блока catch, но на этот раз, по какой-то причине, я не понимаю, он действительно достиг блока catch, но исключение было нулевым.

3 голосов
/ 06 января 2018

Я только что столкнулся с проблемой, когда кто-то передавал ex.InnerException методу, где ex был корнем.Поскольку параметр также назывался ex, это привело к некоторой путанице в отладчике, когда я посмотрел на первоначально пойманную исключительную ситуацию.Вероятно, это было результатом неосторожного рефакторинга.

Например:

public void MyMethod(string input)
{
    try {
        Process(input);
    } catch (Exception ex) { // <- (2) Attempting to view ex here would show null
        _logger.log(ex);
        LogInner(ex.InnerException);
    }
}

private void LogInner(Exception ex)
{
    _logger.log(ex); // <- (1) NullReferenceExeption thrown here
    if(ex.InnerException != null)
        LogInner(ex.InnerException);
}

Реорганизовано так:

public void MyMethod(string input)
{
    try {
        Process(input);
    } catch (Exception ex) {
        LogExceptionTree(ex);
    }
}

private void LogExceptionTree(Exception exception)
{
    _logger.log(exception);
    if(exception.InnerException != null)
        LogExceptionTree(exception.InnerException);
}
3 голосов
/ 12 апреля 2011

Этого не может быть.

Если вы throw null, вы получите NullReferenceException от throw; исключение в блоке catch никогда не может быть null.

У вас есть что-то еще, null.

0 голосов
/ 14 апреля 2011

Я столкнулся с той же проблемой, и причина в том, что исключением является NullReferenceException, поэтому вы не можете использовать ex.Message, и вам следует попробовать поток:

...