Проблема:
Я хотел бы поймать любые исключения из любого метода в классе, чтобы я мог записывать данные, специфичные для класса, в исключение для ведения журнала, прежде чем он будет передан в стек. Я знаю, что могу использовать 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;
}
}