Исключенное исключение - это нуль!
У меня есть приложения 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);
}