Один обработчик исключений для всех исключений класса
У меня есть класс с числом методов и хочу иметь для них один обработчик исключений.
Есть так много этих методов, и у них разные параметры, что было бы уродливо писать try/catch для каждого из них.
Возможно, вы знаете способ, которым я могу это сделать, имея обработчик исключений в классе, который будет обрабатывать их все.
UPDATE:
Многие из вас спрашивают меня, почему. Причина в том, что я вызываю источник данных различными способами.
поэтому мой класс имеет функции getData1, gedData2, getData3, getData4,...., getDataN. Проблема в том, что нет способа проверить, остается ли соединение открытым, а создание нового соединения очень дорого. Поэтому я пытаюсь повторно использовать соединение, и если соединение на следующем вызове не удалось, я поймал бы это и снова подключился и повторю попытку. Вот почему мне нужен этот try/catch весь блок.
чтобы сделать это для всех функций:
try{
datasource.getData()
}
catch(ConnectionException)
{
datasource.Connect();
datasource.getData()
}
Спасибо
Ответы
Ответ 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.