捕获异常本身为null!

时间:2011-04-12 11:28:03

标签: c# asp.net exception null

我有一个ASP.NET应用程序。一切都很好,但最近我得到的异常是空的:

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

有时ex本身就是null

有什么想法吗?

6 个答案:

答案 0 :(得分:43)

对于在这里结束的任何人,我发现了一个可能的实例(如果只能在调试器中检测到)。 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);
}

答案 1 :(得分:5)

就我而言,原因是StackOverflowException。这些例外通常根本不会到达捕获区块,但这一次,由于某种原因我不明白,它确实到达了捕获区块,但异常是空的。

答案 2 :(得分:4)

这不可能发生。

如果您throw null,您将从NullReferenceException获得throw; catch块中的例外永远不会是null

你还有其他的null

答案 3 :(得分:3)

我遇到了一个问题,其中有人将ex.InnerException传递给方法,其中ex是根。由于该参数也称为ex,因此当我查看最初捕获的异常时,它会导致调试器出现一些混乱。这可能是一些粗心重构的结果。

e.g:

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 :(得分:0)

当异常是 AggregateException 时可能会发生这种情况。

答案 5 :(得分:-1)

我遇到了同样的问题,原因是:异常是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); 
}