Я работаю со следующими компонентами:
Я вызываю библиотечный метод с помощью фонового рабочего процесса. Библиотека генерирует исключение, но обработчик RunWorkerCompleted никогда не вызывается.
Единственный способ перехватить исключение — окружить код обработчика DoWork блоком try/catch.
Вы неправильно поняли свойство RunWorkerCompletedEventArgs.Error? Разве это не для получения исключений, которые были пойманы BackgroundWorker?
Пример кода:
static BackgroundWorker w = new BackgroundWorker();
w.DoWork += new DoWorkEventHandler(w_DoWork);
w.RunWorkerCompleted +=
new RunWorkerCompletedEventHandler(w_RunWorkerCompleted);
w.RunWorkerAsync();
static void w_DoWork(object sender, DoWorkEventArgs e)
{
MyClass m = new MyClass();
w.result = m.Compute();
}
static void w_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
HandleException(e.Error);
}
/* result related code */
}
static void HandleException(Exception e)
{
ExceptionPolicy.HandleException(e, "MyPolicy");
}
Приведенный выше пример приводит к завершению моего консольного приложения. Вывод vs2010 абсолютно ничего не пишет (только вывод по умолчанию ).
Так в чем проблема?
//Редактировать :этот фрагмент работает для перехвата исключения библиотеки.
static void w_DoWork(object sender, DoWorkEventArgs e)
{
try
{
MyClass m = new MyClass();
w.result = m.Compute();
}catch(Exception e){ }
}