BackgroundWorker и исключения - PullRequest
       13

BackgroundWorker и исключения

5 голосов
/ 25 ноября 2010

Документы MSDN говорят

Если операция вызывает исключение, которое не обрабатывается вашим кодом, BackgroundWorker перехватывает исключение и передает его в обработчик событий RunWorkerCompleted, гдеэто выставлено как свойство Error System.ComponentModel.RunWorkerCompletedEventArgs

Но когда я попробовал

_workers[i].DoWork += (s, args) =>
{
    throw new Exception("Error!");
};

, я получаю исключение Необработанная ошибка ...перейти к RunWorkerCompleted.Как должны обрабатываться ошибки?

ОБНОВЛЕНИЕ

У меня установлены простые обработчики

_workers[i].DoWork += (s, args) =>
{
    throw new Exception("Error!");
}
...
_workers[i].RunWorkerCompleted += (s, args) =>
{
    if (args.Error != null) {
        string dummy = args.Error.Message;
    }
    ...
};

Код никогда не уходит DoWork

Ответы [ 3 ]

3 голосов
/ 25 ноября 2010

Если исключение выдается и проходит через пользовательские фреймы, но затем не перехватывается пользовательским кодом, оно считается «необработанным пользователем».

Так что я думаю, что есть 3 возможности:

  • Это исключение первого шанса - поэтому, если вы нажмете F5, исключение будет распространяться как обычно
  • Нажмите «Редактировать код» в помощнике по исключениям.Затем выполните редактирование и продолжить, чтобы решить проблему.
  • Перейдите в раздел «Отладка-> Исключения» и отмените выбор столбца «необработанный пользователем».
2 голосов
/ 29 февраля 2012

Если вы работаете через отладчик, Visual Studio остановится на исключениях в обработчике BackgroundWorker.DoWork, а не будет молча передавать исключение в событие RunWorkerCompleted, что происходит, когда его нет в отладчике.

1) Вы можете просто нажать F5 и продолжить выполнение, чтобы следовать исключению (как упомянул RoadWarrior)

2) Если это слишком раздражает, для DoWork не используйте делегаты / лямбды, но используйте именованные методыи украсить [DebuggerStepThrough] атрибутом.Это позволит отладчику игнорировать этот метод и не останавливаться на исключении, чтобы вы могли просматривать «нормальное» поведение фонового рабочего.

См .: Отладка Visual Studio 2008 - Пропуск кода

0 голосов
/ 25 ноября 2010

Вчера я сделал обработку исключений в BackgroundWorker.Я не добавил ни одного броска в обработчик DoWork.Если произойдет исключение, вы сможете получить его в RunWorkerCompleted, не выбрасывая его.Только не забудьте отменить работу, если возникнет исключение.

...