Подтвердить что ты не робот

Один обработчик исключений для всех исключений класса

У меня есть класс с числом методов и хочу иметь для них один обработчик исключений. Есть так много этих методов, и у них разные параметры, что было бы уродливо писать try/catch для каждого из них.

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

UPDATE:


Многие из вас спрашивают меня, почему. Причина в том, что я вызываю источник данных различными способами. поэтому мой класс имеет функции getData1, gedData2, getData3, getData4,...., getDataN. Проблема в том, что нет способа проверить, остается ли соединение открытым, а создание нового соединения очень дорого. Поэтому я пытаюсь повторно использовать соединение, и если соединение на следующем вызове не удалось, я поймал бы это и снова подключился и повторю попытку. Вот почему мне нужен этот try/catch весь блок.

чтобы сделать это для всех функций:

try{    
   datasource.getData()
}
catch(ConnectionException)
{
   datasource.Connect();
   datasource.getData()
}

Спасибо

4b9b3361

Ответ 1

Вы можете использовать делегат для передачи вашего кода метода в один захват try, как в следующем примере:

    private void GlobalTryCatch(Action action)
    {
        try
        {
            action.Invoke();
        }
        catch (ExpectedException1 e)
        {
            throw MyCustomException("Something bad happened", e);
        }
        catch (ExpectedException2 e)
        {
            throw MyCustomException("Something really bad happened", e);
        }
    }

    public void DoSomething()
    {
        GlobalTryCatch(() =>
        {
            // Method code goes here
        });
    }

Ответ 2

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

В любом случае, вы можете использовать методы AOP (аспектно-ориентированное программирование) для внедрения кода обработки исключений (статически или во время выполнения) вокруг методов вашего класс.

Там есть хорошая библиотека пост-обработки сборки, называемая PostSharp, которую вы можете настроить с помощью атрибутов для методов в своем классе:

Вы можете определить такой аспект (с сайта PostSharp):

public class ExceptionDialogAttribute : OnExceptionAspect
{
    public override void OnException(MethodExecutionEventArgs eventArgs)
    {
        string message = eventArgs.Exception.Message;
        MessageBox.Show(message, "Exception");
        eventArgs.FlowBehavior = FlowBehavior.Continue;
    }
}

И тогда вы примените атрибут к методам, которые вы хотите наблюдать за исключениями,  например:

public class YourClass {

    // ...

    [ExceptionDialog]
    public string DoSomething(int param) {
        // ...
    }
}

Вы также можете применить атрибут к всему классу, например:

[ExceptionDialog]
public class YourClass {
    // ...
    public string DoSomething(int param) {
        // ...
    }
    public string DoSomethingElse(int param) {
        // ...
    }
}

Это применит совет (код обработки исключений) к каждому методу в классе.

Ответ 3

Я не думаю, что есть. Вы можете переместить try/catch вызывающему, но это не очень хороший дизайн. Возможно, лучше разделить его на другой класс и использовать Reflection для вызова методов, например:

public class MyClass {}
public class MySafeClass {
    public void CallMethod(string name, object[] param) {
        Type t = typeof(MyClass);
        MyClass mc = new MyClass();
        try {
            t.GetMethod(name).Invoke(mc, param);
        }
        catch {
            //...;
        }
    }

}

Но вы не должны! Это не очень хорошая практика.

Другой метод все еще использует try/catch, но имеет единственный метод для исключения исключений и т.д. обратно пользователю:

public class MyClass {
    void DoException(string message) {
        throw new Exception(message);
    }
}

Но это еще не так хорошо.

Я не понимаю, почему это было бы уродливо - даже если вы просто оберните весь метод в один try/catch сообщением. Это может быть осуществимо.

Это также лучший вариант, чтобы просто оставить их и передать их обратно вызывающему, возможно, в try/finally.

Не сложно попробовать/поймать все, особенно с помощью фрагментов в Visual Studio и SharpDevelop.

Ответ 4

Это звучит как проблема с вашим дизайном. Можете ли вы подробно рассказать о том, какие исключения вы пытаетесь поймать и почему, и мы можем попробовать и помочь с этим.

Ответ 5

Исключения не относятся к классу, а метод /callstack - ориентирован. Объект должен, в общем, не пытаться обрабатывать исключения из его собственных методов. Это зависит от вызывающих этих методов.

Ответ 6

вы можете захотеть применить метод try/catch о вас, хотя я считаю, что это серьезное злоупотребление обработкой исключений, за исключением того, что вы хотите добавить регистратор или sth.