Gestione delle eccezioni dei precedenti

Sono leggermente confuso su come gestire un’eccezione.

Ho un thread di background worker che esegue un processo di lunga durata. La mia comprensione è che se si verifica un’eccezione sul thread di background worker, il codice finirà comunque con il metodo RunWorkerCompleted.

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Error != null) throw e.Error; 

Se questo è il caso, c’è un punto nel mettere un blocco catch try attorno a bgWorker.RunWorkerAsync (); chiamata, presumo di no?

Voglio rilanciare l’eccezione che viene rilevata nel metodo RunWorkerCompleted, come posso fare questo senza perdere la traccia dello stack – è quello che ho sopra corretto? Ho letto che quando rilanciare un’eccezione dovresti semplicemente usare “lanciare”?

Ti suggerisco di creare qualche eccezione specifica per il business, che descrive l’operazione che stavi facendo in background. E lancia questa eccezione con l’eccezione originale come eccezione interna:

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

In questo modo sarà disponibile l’eccezione originale con la sua traccia di stack e verrà generata un’eccezione più descrittiva.

Nota: se non si desidera creare una nuova class di eccezioni, è ansible utilizzare ApplicationException o Exception esistenti. Ma non è così informativo e se lo vuoi prendere da qualche parte, allora non sarai in grado di cogliere questa particolare eccezione

Prova questo

 void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Error != null) throw new Exception("My Custom Error Message", e.Error); 

Se questo è il caso, c’è un punto nel mettere un blocco catch try attorno a bgWorker.RunWorkerAsync (); chiamata, presumo di no?

No non puoi farlo perché bgWorker.RunWorkerAsync(); è un metodo (non an event ). Se si esegue il debugger di Visual Studio, il debugger si interromperà al punto nel gestore di eventi DoWork in cui è stata sollevata l’eccezione non gestita. Quindi puoi fare qualcosa di simile

  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; } }