我有一个ASP.NET应用程序。一切都很好,但最近我得到的异常是空的:
try
{
// do something
}
catch (Exception ex)
{
Logger.Log("Error while tried to do something. Error: " + ex.Message);
}
有时ex
本身就是null
!
有什么想法吗?
答案 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);
}