2009-11-03 17 views
16

Abbiamo un'interfaccia IPoller per la quale abbiamo varie implementazioni. Abbiamo un processo che richiederà un IPoller e lo avvierà in un thread separato. Sto cercando di trovare un modo generico di fornire una gestione delle eccezioni per tutti gli IPollers che non lo fanno da soli.Cosa succede quando un thread .NET genera un'eccezione?

Il mio pensiero originale era di creare un'implementazione di IPoller che accettasse un IPoller e fornisse solo alcune funzionalità di registrazione. La domanda che ho incontrato è come posso fornire questa gestione degli errori? Se ho IPoller.Start() che è il target per il Thread è quello in cui si verificherà l'eccezione? O c'è qualcosa sul thread stesso in cui posso collegarmi?

risposta

19

Qualcosa di simile:

Thread thread = new Thread(delegate() { 
    try 
    { 
     MyIPoller.Start(); 
    } 
    catch(ThreadAbortException) 
    { 
    } 
    catch(Exception ex) 
    { 
     //handle 
    } 
    finally 
    { 
    } 
}); 

Ciò assicurerà che l'eccezione non arrivi all'inizio del thread.

+0

Si potrebbe anche voler prendere l'AppDomainUnloadedException. MSDN: un'appDomainUnloadedException viene generata in un thread perché il dominio dell'applicazione in cui viene eseguito il thread viene scaricato. –

9

È necessario rilevare l'eccezione nel metodo utilizzato nella parte superiore del thread e eseguire la registrazione da lì.

Un'eccezione non gestita (nella parte superiore di un thread) consentirà (in 2.0 in poi) di interrompere il processo. Non bene.

vale a dire qualsiasi metodo si passa alla Thread.Start (etc) dovrebbe avere un try/catch, e fare qualcosa di utile nel catch (logging, forse arresto regolare, ecc).

Per raggiungere questo obiettivo, è possibile utilizzare:

  • metodi statici di registrazione
  • variabili catturati nel delegato (come un metodo anonimo)
  • esporre il metodo su un'istanza che già conosce il logger
3

Date un'occhiata a AppDomain.UnhandledException, che vi aiuterà almeno accede tali eccezioni che non si è manipolazione, e in alcuni casi chiudere "bene":

Questo evento fornisce la notifica di eccezioni non gestite fanno. Consente all'applicazione di registrare le informazioni su l'eccezione prima che l'handler predefinito del sistema segnala l'eccezione all'utente e termina l'applicazione . Se le informazioni sufficienti sullo stato dell'applicazione sono disponibili per , è possibile intraprendere altre azioni , ad esempio il salvataggio dei dati del programma per il successivo ripristino. Attenzione è consigliato, perché i dati di programma possono danneggiati quando le eccezioni sono non gestite.

0

eccezione Dai un'occhiata alla

Appdomain.FirstChanceException event

Ti dice momento si verifica alcuna eccezione e CLR è alla ricerca di traccia dello stack. Anche gli argomenti degli eventi indicano quale tipo di eccezione. Puoi considerarlo come il luogo centrale per la registrazione.

Problemi correlati