Я сделал следующее в аналогичной ситуации. Я покажу технику в два этапа ...
Шаг 1. Создайте метод, предоставляющий определенный контекст выполнения для другого кода:
// this static method is responsible for setting up a context for other code
// to run in; specifically, it provides the exception handling "plumbing":
public static void guarded(Action action)
{ // ^^^^^^^^^^^^^
try // actual code to be executed
{
action();
}
catch (SomeExceptionA ea)
{
// handle exception...
}
catch (SomeExceptionB eb)
{
// handle exception...
}
// etc.
}
Шаг 2. Примените этот контекст к любому коду:
Далее вы просто «оборачиваете» обработку исключений вокруг реального кода в ваших методах:
public void MethodA()
{
guarded(() => // <-- wrap the execution handlers around the following code:
{
// do something which might throw an exception...
});
}
public void MethodB()
{
guarded(() =>
{
// do something which might throw an exception...
});
}
Резюме:
Общая идея здесь - написать функцию (guarded
в вышеприведенном примере), которая устанавливает конкретный контекст выполнения для запуска другого кода. (Контекст в этом примере обеспечивает обработку исключений.) должен быть выполнен в этом контексте, предоставляется как лямбда-функция. Вы даже можете адаптировать функцию создания контекста, чтобы код в лямбда-функции мог возвращать значение.