Когда исключение в приложении .NET WinForms может быть съедено без перехвата или всплытия до исключения Windows? - PullRequest
5 голосов
/ 28 января 2009

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

Каковы возможные причины этого?

Редактировать: Кажется, что это не зависит от типа броска исключения, а скорее от того, где он выброшен. Это было проверено, просто добавив:

throw new Exception("Test Exception");

Он будет отображаться в отладчике, но не будет отображаться снаружи, поэтому в нашем случае это не исключение ThreadAbortedException или что-то, что зависит от того, является ли он определенным типом исключения.

Ответы [ 6 ]

2 голосов
/ 28 января 2009

Существуют некоторые особые исключения, которые не всплывают и не улавливаются, похоже, вы имеете дело с одним из них: см. ThreadAbortException

1 голос
/ 29 января 2009

Найден один случай, когда это может произойти, если есть исключение в обработчике события UnhandledException. Простой способ убедиться в этом: В обработчике событий Form.Load выведите любое старое исключение. В событие Application.ThreadException поместите что-то похожее на следующее:

static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
     string b = null;
     int i = b.Length;
}

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

0 голосов
/ 04 января 2010

В некотором роде здесь, но может ли быть так, что вы просто настроили отладчик на разрыв при возникновении исключения, и не только для необработанных?

0 голосов
/ 29 января 2009

Используете ли вы .Net 1.0 / 1.1? Произошло огромное изменение в поведении при переходе с 1.1 на 2.0. До этого исключения frameworok молча глотали исключения, созданные в созданных вами потоках или потоках ThreadPool, и поток завершал работу. К счастью, это поведение было исправлено.

С MSDN :

Изменить с предыдущих версий

Самое значительное изменение касается в управляемые темы. В .NET Framework версии 1.0 и 1.1, общеязыковая среда выполнения обеспечивает backstop для необработанных исключений в следующие ситуации:

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

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

  • Не существует такой вещи, как необработанный Исключение из потока финализатора. Когда финализатор выдает исключение что он не обрабатывает, время выполнения печатает трассировку стека исключений в консоль, а затем позволяет завершить работу потока финализатора финализаторы.

0 голосов
/ 28 января 2009

Ваш код вызывается из фреймворка.

Иногда платформа переносит свои вызовы в обработчик исключений.

Таким образом, если в вашем коде есть исключение, оно может быть (если есть обработчик исключений в платформе) поймано и проигнорировано платформой.

Может быть, отладчик показывает его как "необработанный", потому что, хотя в фреймворке есть обработчик, в вашем коде нет обработчика? Или потому, что в обработчике есть что-то странное в обработчике, например, что это неуправляемый структурированный обработчик исключений?

0 голосов
/ 28 января 2009

Если вы попытаетесь изменить свойства элемента управления Windows Form из другого потока, в котором был создан элемент управления, вы получите InvalidOperationException , если к нему подключен отладчик, но в противном случае он автоматически игнорируется.

Более подробную информацию о проблеме можно найти здесь:

http://msdn.microsoft.com/en-us/library/ms171728(VS.80).aspx

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