Возможно ли в .Net перехватить все необработанные исключения из любого метода в классе до того, как они будут переданы в стек вызовов?

Проблема:

Я хотел бы перехватить любые исключения из любого метода в классе, чтобы я мог записывать данные, относящиеся к классу, в исключение для регистрации, прежде чем они будут переданы в стек . Я знаю, что могу включить 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;
    }
}
12
задан KowalskiTom 20 October 2011 в 17:06
поделиться