Sono nuovo nello sviluppo di software e anche nuovo nello stackoverflow, quindi non esagerare.Eccezioni non gestite nella libreria di classi C# per scopi di logging
BACKGROUND: Sto sviluppando una libreria di classi C# che elabora i messaggi xml inviati da un'applicazione di terze parti su tcp/ip (utilizzando i socket asincroni). Sto usando com-interop per esporre la libreria di classi a un'applicazione Vb6. Quando la libreria C# elabora l'xml che riceve tramite il socket, solleva vari eventi a cui l'applicazione vb6 consumante si abbona (in questo modo, quando eventualmente riscriviamo l'intera applicazione in .Net, questo sarà già fatto con questo componente).
DOMANDA: Voglio catturare tutte le eccezioni non gestite SOLO PER SCOPI DI REGISTRAZIONE. In un'applicazione winforms è possibile collegare un evento a AppDomain.CurrentDomain.UnhandledException e Application.ThreadException. Non c'è modo di afferrare in modo simile i dati delle eccezioni per registrare le informazioni in una libreria di classi?
punti importanti:
Io non sto cercando di recuperare da queste eccezioni, ma semplicemente il login e lasciare che l'eccezione Propaga e mandare in crash l'applicazione, se necessario.
Sto facendo del mio meglio per rilevare tutte le eccezioni specifiche localmente ovunque io sappia che potrebbero verificarsi. Quindi il mio scopo è solo registrare le eccezioni veramente inaspettate.
- So che alcuni diranno che questo sarebbe un cattivo modello di progettazione. Dovrei invece lasciare che il chiamante si occupi di queste eccezioni. Il problema è che l'applicazione vb6 non ha una gestione degli errori così solida come vorrei. In primo luogo, voglio registrare la traccia dello stack in modo che se l'app vb6 si arresta in modo anomalo a causa della mia DLL, posso visualizzare il log per essere avvisato di potenziali aree del mio codice C# che potrebbero dover essere cambiate.
Qualcuno può fornirmi qualche direzione? L'opzione migliore che ho trovato finora sembra mettere un blocco catch generico in ogni metodo pubblico, registrare l'eccezione e poi lanciarlo. Questo sembra proprio l'ideale:
public void SomeMethod()
{
try
{
// try something here...
}
catch (Exception ex)
{
Log(ex);
throw;
}
}
Questo non solo sembrare una cattiva progettazione, ma in aggiunta non so cosa sarebbe successo se uno dei callback asincroni causa un'eccezione in un thread diverso rispetto al metodo è stato chiamato sopra. Questo blocco generale di prova/cattura catturerebbe ancora un'eccezione del genere?
Grazie per qualsiasi assistenza.
EDIT: Inizialmente contrassegnato la risposta di @Eric J. come corretta, ma dopo aver tentato di implementare la soluzione ho scoperto che non funzionerà bene con i callback asincroni della classe socket che sto usando . Una volta che si utilizza un thread del threadpool per attivare la richiamata asincrona, non riesco a percepire eccezioni che si verificano successivamente nello stack. Dovrò utilizzare un framework AOP o ci sono altri modi per cogliere queste eccezioni?
Il vero problema era che non avevo un blocco catch di primo livello nelle mie funzioni di callback asincrono. Poiché vengono eseguiti su thread separati (thread thread-pool), le loro eccezioni non eseguono il backup di "bolle" altrove. AOP sembra una buona soluzione per questo scenario per evitare così tanti blocchi di cattura di primo livello. È qualcosa che intendo investire un po 'di tempo in un po' più avanti. –