2013-12-14 16 views
8

Ich bin etwas verwirrt, wie man mit einer Ausnahme umgehen kann.Hintergrund-Ausnahmebehandlung

Ich habe einen Hintergrund-Worker-Thread, der einige lange laufende Prozess läuft. Mein Verständnis ist, wenn eine Ausnahme im Hintergrund Worker-Thread auftritt der Code wird immer noch bei der RunWorkerCompleted-Methode.

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 

     if (e.Error != null) 
      throw e.Error; 

Wenn dies der Fall ist, da jeder Punkt einen Versuch catch-Block um die bgWorker.RunWorkerAsync in Putten(); Ruf an, nehme ich nicht an?

Ich möchte die Ausnahme, die in der RunWorkerCompleted-Methode gefangen ist, erneut auslösen, wie kann ich dies tun, ohne den Stack-Trace zu verlieren - ist das, was ich oben richtig habe? Ich habe gelesen, dass Sie beim Auslösen einer Ausnahme einfach "werfen" verwenden sollten.

Antwort

13

tun Ich schlage vor, Sie einige Unternehmen spezifische Ausnahme zu schaffen, die den Betrieb beschreibt, die Sie im Hintergrund zu tun wurden. Und werfen diese Ausnahme mit ursprünglicher Ausnahme als innere Ausnahme:

private void bgWorker_RunWorkerCompleted(
    object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Error != null) 
     throw new BusinessSpecificException("Operation failed", e.Error); 
    // ... 
} 

So ursprüngliche Ausnahme mit seinem Stack-Trace verfügbar sein wird, und Sie haben mehr beschreibende Ausnahme ausgelöst.

Hinweis - Wenn Sie keine neue Ausnahmeklasse erstellen möchten, können Sie die vorhandenen ApplicationException oder Exception verwenden. Aber es ist nicht so informativ, und wenn Sie es irgendwo gehen zu fangen, dann werden Sie nicht in der Lage sein, diese besondere Ausnahme zu fangen nur

2

If this is the case is there any point in putting a try catch block around the bgWorker.RunWorkerAsync(); call, I assume not?

Nein, Sie dies nicht tun können, weil bgWorker.RunWorkerAsync(); es ein Verfahren (nicht an event) ist. Wenn Sie unter dem Visual Studio-Debugger ausgeführt werden, wird der Debugger an dem Punkt im DoWork-Ereignishandler unterbrochen, in dem die nicht behandelte Ausnahme ausgelöst wurde. So können Sie so etwas wie dieses

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      try 
      { 
       //put your break point here 
       // here you can capture your exception 
      } 
      catch (Exception ex) 
      { 
       // here catch your exception and decide what to do     
       throw; 
      } 



     } 
+0

so in diesem Fall würde ich nicht müssen Sie eine Fehlerbehandlung in meiner RunWorkerCompleted-Methode durchführen? Oder ist es besser, mit Fehlern in der RunWorkerCompleted-Methode umzugehen? – mHelpMe

+0

Wenn Sie die Ausnahme in Ihrem Worker-Thread behandeln, können Sie sie nicht in RunWorkerCompleted abrufen. Wenn Sie in DoWork nicht damit umgehen, stürzt Ihre Anwendung möglicherweise ab, wenn Sie etwas falsch machen –

7

Versuchen Sie, diese

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 

     if (e.Error != null) 
      throw new Exception("My Custom Error Message", e.Error);