c# - примеры - Один обработчик исключений для всех исключений класса




пользовательские исключения c# (4)

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

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

ОБНОВИТЬ:

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

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

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

Спасибо


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


Вы можете использовать делегат для передачи кода вашего метода в одну попытку 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
        });
    }

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


Я не думаю, что есть. Вы можете перенести команду 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/finally .

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







exception