2011-01-10 14 views
9
catch (ThreadAbortException) 
{ } 
catch (Exception ex) 
{ 
    TraceManager.TraceException(ex, 
           (int)ErrorCode.GENERIC_EXCEPTION, 
           ex.StackTrace + "\n" + ex.Message + "\n" + VendorUrl); 
} 

ha senso avere anche ilHa senso rilevare ThreadAbortException e non eseguire alcuna azione?

catch (ThreadAbortException) 
{ } 

o volontà che causano il ThreadAbortException essere ingerite e perduto per sempre?

+4

'ThreadAbortException' verrà rieseguito al completamento del gestore. – Gabe

risposta

29

ThreadAbortException non può essere catturato "completamente"; verrà automaticamente retrocesso alla fine del blocco catch (consultare la pagina dei documenti MSDN collegati) a meno che non venga chiamato primaThread.ResetAbort.

Quindi, l'unica sensata catch blocco sarebbe:

catch (ThreadAbortException) 
{ 
    // possibly do something here 
    Thread.ResetAbort(); 
} 

Ma questo ha un odore davvero male. Probabilmente non c'è motivo di farlo, quindi potresti voler ripensare al tuo approccio.

Aggiornamento: Ci sono molte domande sul SO che si occupano di Thread.Abort:

This one ha la stessa risposta che ho dato qui. This one ha una risposta che si espande in "non chiamare mai Thread.Abort a meno che Cthulhu non sia in aumento" (che ho ridotto notevolmente ad un "cattivo odore").

Ci sono anche molti altri.

+1

+1: selezione nitrificante. Può essere catturato - sarà semplicemente rigettato. – Hogan

+0

@Hogan: riformulato un po '; ora il significato dovrebbe essere più chiaro. – Jon

+0

Risposta molto bella. Darei un altro +1 se potessi. – Hogan

4

La ThreadAbortException non può essere catturata in questo modo. Verrà riavviato automaticamente alla fine del blocco catch a meno che non chiami Thread.ResetAbort();

Avere un blocco catch come qui per ThreadAbortException consente di eseguire automaticamente la retrocessione senza il blocco catch (Exception) che tenta di gestirlo.

-3

Sarà catturato e perso. In realtà dovresti solo rilevare eccezioni con cui puoi fare qualcosa o che tu registri e poi ripeti (con throw, non getti new [qualche eccezione];).

0

Se si vuole fare qualcosa di specifico per diversi tipi di eccezioni, allora fa in modo da avere blocchi di cattura separati. In caso contrario, si può semplicemente utilizzare il fermo unica eccezione

+3

Non sono d'accordo. Di solito è meglio essere specifici su ciò che stai catturando.Penso che se non sai quali tipi di eccezioni il tuo blocco "try" potrebbe generare, significa che non hai dato abbastanza test alla tua applicazione. –

+0

Sono d'accordo Ilya. +1 – Nick

0

Calling Thread.Abort su un thread imposta in modo efficace una bandiera che causerà un ThreadAbortException ad essere gettato qualsiasi codice di tempo non sta elaborando tale eccezione né associato finally blocchi. La cattura dell'eccezione senza chiamare Thread.ResetAbort() comporterà semplicemente il tempo di esecuzione che genera un'altra ThreadAbortException alla successiva occasione. Tale comportamento non è completamente privo di significato, tuttavia, poiché causerà il completamento di tutti i blocchi interni finally prima che l'eccezione possa essere visualizzata dai blocchi di filtro delle eccezioni esterni. Che sia o meno una cosa buona dipenderà dall'applicazione.

Problemi correlati