vorrei cogliere eventuali eccezioni da qualsiasi metodo in una classe in modo che io possa registrare i dati specifici della classe di eccezione per la registrazione prima di essere superato lo stack. So che posso mettere un try-catch in ogni metodo della classe, ma ci sono molti metodi e sembra che ci dovrebbe essere un modo più efficiente.
Esempio di quello che sto facendo attualmente:
public class ClassA
{
private int x;
private int y;
public void Method1()
{
try
{
//Some code
}
catch(Exception ex)
{
ex.Data.Add("x", x);
ex.Data.Add("y", y);
throw;
}
}
public void Method2()
{
try
{
//Some code
}
catch (Exception ex)
{
ex.Data.Add("x", x);
ex.Data.Add("y", y);
throw;
}
}
}
esempio di quello che vorrei fare:
public class ClassB : IUnhandledErrorHandler
{
private int x;
private int y;
public void Method1()
{
//Some code
}
public void Method2()
{
//Some code
}
void IUnhandledErrorHandler.OnError(Exception ex)
{
ex.Data.Add("x", x);
ex.Data.Add("y", y);
throw;
}
}
public interface IUnhandledErrorHandler
{
void OnError(Exception ex);
}
Nota: Questa classe è un servizio in un progetto WCF e implementa un ServiceContract. Ho provato ad aggiungere un ErrorHandler al ChannelDispatcher del servizio. Tuttavia, quando l'errore raggiunge ErrorHandler, è già oltre l'ambito della classe in cui si è verificato l'errore, quindi non posso accedere ai dettagli della classe.
Soluzione:
public class ClassC
{
public ClassC()
{
AppDomain.CurrentDomain.FirstChanceException += OnError;
}
private int x;
private int y;
public void Method1()
{
//Some code
}
public void Method2()
{
//Some code
}
private void OnError(object sender, System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs e)
{
e.Exception.Data["x"] = x;
e.Exception.Data["y"] = y;
}
}
È solo per il debug? Vuoi inviare le eccezioni al client o semplicemente tenerle su server? –
È per il debug/logging sul lato server. – KowalskiTom
Non si dovrebbe mai usare "throw ex;". Questo fa sembrare che l'eccezione originariamente venisse dalla posizione di "throw ex;". –