Проблема:
Я хотел бы перехватить любые исключения из любого метода в классе, чтобы я мог записывать данные, относящиеся к классу, в исключение для регистрации, прежде чем они будут переданы в стек . Я знаю, что могу включить try-catch в каждый метод класса, но существует много методов, и кажется, что должен быть более эффективный способ.
Пример того, что я сейчас делаю:
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;
}
}
}
Пример того, что я хотел бы сделать:
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);
}
Примечание: Этот класс является службой в проекте WCF и реализует ServiceContract. Я попытался добавить ErrorHandler в ChannelDispatcher службы. Однако когда ошибка достигает ErrorHandler, она уже выходит за рамки класса, в котором произошла ошибка, поэтому я не могу получить доступ к сведениям о классе.
Решение:
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;
}
}