Как избежать дублирования блоков catch try

У меня есть несколько методов, которые выглядят так:

public void foo()
{
   try 
   {
      doSomething();
   }
   catch(Exception e)
   {
      Log.Error(e);
   }
 }

Можно ли изменить код, чтобы он выглядел?

[LogException()]
public void foo()
{   
   doSomething();
}

Как я могу реализовать этот настраиваемый атрибут? и каковы плюсы и минусы этого?

----- Редактировать 1 ------------

Могу ли я реализовать его сам, я имею в виду просто написать один класс или мне нужно использовать postharp или другое решение?

Ответ 1

Вы можете использовать делегаты и lambdas:

private void ExecuteWithLogging(Action action) {
    try {
        action();
    } catch (Exception e) {
        Log.Error(e);
    }
}

public void fooSimple() {
    ExecuteWithLogging(doSomething);
}

public void fooParameter(int myParameter) {
    ExecuteWithLogging(() => doSomethingElse(myParameter));
}

public void fooComplex(int myParameter) {
    ExecuteWithLogging(() => {
        doSomething();
        doSomethingElse(myParameter);
    });
}

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

Ответ 2

Вы можете попробовать: PostSharp

или попробуйте google 'AOP' - "Ориентированное на аспект программирования". В Интернете есть более похожие методы.

Ответ 4

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

    protected TResult DoWrapped<TResult>(Func<TResult> action)
    {
        try
        {
            return action();
        }
        catch (Exception)
        {
            // Do something
            throw;
        }
    }

С похожими способами.

    public object AMethod(object param)
    {
        return DoWrapped(() =>
                      {
                          // Do stuff
                          object result = param;
                          return result;
                      });
    }

Не помню точно, это было какое-то время. Но похоже на это.