Как пойманное исключение может быть нулевым (не NullReferenceException)? - PullRequest
5 голосов
/ 03 декабря 2009

Я столкнулся с довольно странной маленькой проблемой.

В следующем коде я не могу понять, как e может быть null;

try
{
    //Some Code here
}
catch (Exception e)
{
    //Here e is null
}

Насколько я знаю, throw null будет преобразовано в throw new NullReferenceException().

Проблема, похоже, связана с многопоточностью, поскольку удаление другого потока также, похоже, исправляет ее. Или, по крайней мере, я видел это только тогда, когда приведенный выше код запускается в новом потоке. Вся программа использует много потоков и немного сложна.

В любом случае, мой вопрос, как e может быть нулевым? - Надеюсь, ответ на этот вопрос поможет найти источник этой проблемы.

Редактировать Я обнаружил его, поскольку он вызвал исключение NullReferenceException в операторе catch, и с помощью отладчика я вижу то же самое.

Редактировать 2 Откройте VisualStudio на следующий день, повторите попытку, код не изменяется, и теперь та же самая ключевая фраза «вызывается», но на этот раз она не равна нулю. Похоже, это был сбой VS.

Ответы [ 4 ]

7 голосов
/ 03 декабря 2009

Как вы определяете, что e на самом деле равно нулю? Я попробовал несколько примеров и прочитал спецификацию CLI об исключениях, и это, кажется, не допускает, чтобы значение исключения было нулевым. Кроме того, если бы он был нулевым, у него не было бы типа и, следовательно, он не мог бы соответствовать критериям фильтра для исключения типа.

Используете ли вы отладчик для проверки этого значения? Если это так, попробуйте переключить его на встроенное утверждение.

2 голосов
/ 03 декабря 2009

Вы положительный Вы были вне линии исключения?

try
{
    //Some Code here
}
catch (Exception e)
{
    int i = 0; // breakpoint here
}

Я спрашиваю об этом только потому, что никогда и никогда не видел такого поведения, и я знаю, что если вы установите точку прерывания Exception e, то e будет нулевым. На следующей строке оно становится не нулевым.

1 голос
/ 03 декабря 2009

Возможно, что выбрасываемое исключение не является CLS-совместимым, что на самом деле не должно быть перехвачено Try / Catch с фильтром.

Вы должны быть в состоянии поймать CLS-совместимый только с try {} catch {} без исключения «аргумент»

0 голосов
/ 18 января 2012

У меня тоже такая же ситуация. Это было ошибкой отладчика Eclipse. Перезапуска Eclipse достаточно - исключение времени выполнения становится нормальным, а не нулевым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...