Необработанный, не-пользовательский поток, исключения в Windows Forms - PullRequest
1 голос
/ 30 декабря 2008

Если не считать вставки блока try / catch в каждый метод рабочего потока, есть ли способ справиться с необработанным потоком, не связанным с пользовательским интерфейсом, исключениями в Windows Forms?

Thread.GetDomain().UnhandledException отлично работает для обнаружения ошибки, но к тому времени уже слишком поздно что-либо предпринимать по этому поводу (кроме записи в журнал). После того, как контроль выйдет из вашего UnhandledException обработчика, приложение будет остановлено. Лучшее, на что вы можете надеяться, это общая ошибка Windows, которая выглядит так:

http://i40.tinypic.com/2be98i.jpg

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

Спасибо.

Ответы [ 4 ]

2 голосов
/ 30 декабря 2008

Если вы хотите что-то сделать с ошибкой до того, как она попадет в UnhandledException, тогда вам нужен метод try / catch в методе thread.

Вы должны по крайней мере обрабатывать исключения, такие как FileNotFoundException, где вы можете сделать что-то умное с этим. Если ничего не помогает, вы можете использовать UnhandledException для чистой обработки всего, чего вы не ожидали (что, надеюсь, ничего).

1 голос
/ 30 декабря 2008

Thread. один раз за поток.

необработанные исключения во вторичных потоках убьют поток. см SafeThread для альтернативы

предостережение: я являюсь автором статьи SafeThread

0 голосов
/ 30 декабря 2008

Чтобы обработать исключение, вы должны вставить блок try / catch внутри кода, который выполняется в потоке.

Если подумать, исключение UnhandledException на самом деле хорошо названо. Исключение было «не обработано», и поэтому вы ничего не можете с этим поделать. Слишком поздно!

И действительно, вне контекста потока вы мало что можете сделать, чтобы «спасти» его от сбоя, поскольку у вас нет контекста для исправления. Таким образом, UnhandledException полезна для регистрации и попыток определить, почему что-то потерпело крах , после это происходит сбой.

Если вы думаете о том, как работает try / catch:

try
{
  // run this code

}
catch (Exception ex)
{
  // an exception happened in the above try statement inside MY thread
}
0 голосов
/ 30 декабря 2008

Похоже, вы неправильно поняли ... Вы не помещаете код "в" поток. Вы запускаете код "на" поток.

Куда бы вы ни поместили блок try catch, он может быть выполнен в любом потоке ... если вы хотите, чтобы код в catch что-то делал (манипулировал) элементом пользовательского интерфейса, вам просто нужно «запустить» этот код в каком-либо потоке были созданы элементы пользовательского интерфейса (при необходимости).

Каждый элемент пользовательского интерфейса WinForms имеет два члена, чтобы помочь вам с этим, InvokeRequired (), который возвращает логическое значение, если он выполняется в каком-либо потоке ДРУГОЕ, чем поток, в котором был создан элемент (в этом случае вы должны переключать потоки) и BeginInvoke (), который автоматически переключается на правильный поток.

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