Исключенное исключение - это нуль!

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

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

Иногда ex сам null!

Любая идея?

Ответ 1

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

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

Fixed

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);
}

Ответ 2

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

Ответ 3

Я просто столкнулся с проблемой, когда кто-то передавал 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);
}

Ответ 4

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

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

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

Ответ 5

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

try
 {     // do something } 

catch (NullReferenceException)
{
  Logger.Log("Error while tried to do something. Error: Null reference");
}

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