Obsługa wyjątków BackgroundWorker
Pracuję z następującymi komponentami:
biblioteka (która zgłasza wyjątek)konsola testowa do testowania mojego logowaniabloki aplikacji obsługi wyjątków biblioteki korporacyjnejbloki aplikacji do rejestrowania biblioteki korporacyjnejWywoływam metodę biblioteczną przy użyciu programu działającego w tle. Biblioteka zgłasza wyjątek, ale program obsługi RunWorkerCompleted nigdy nie jest wywoływany.
Jedynym sposobem na złapanie wyjątku jest otoczenie mojego kodu obsługi DoWork blokiem try / catch.
Czy została błędnie zrozumiana właściwość RunWorkerCompletedEventArgs.Error? Czy nie chodzi o uzyskanie wyjątków, które zostały przechwycone przez BackgroundWorker?
Przykładowy kod:
<code>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"); } </code>
Powyższy przykład prowadzi do zakończenia mojej aplikacji konsoli. Wyjście vs2010 nie zapisuje absolutnie nic (tylko wyjście domyślne).
Więc gdzie jest problem?
// Edytuj: ten fragment działa w celu przechwycenia wyjątku biblioteki.
<code>static void w_DoWork(object sender, DoWorkEventArgs e) { try { MyClass m = new MyClass(); w.result = m.Compute(); }catch(Exception e){ } } </code>