Я бы согласился с @Kent и другими, что AoP выглядит здесь хорошо, а также с @sleske, что необходимость делать это для каждого метода предполагает, что у вас могут возникнуть проблемы с дизайном.
Сказав это, просто чтобыВ качестве альтернативы, я сделал одну вещь в аналогичной ситуации (хотя и не для каждого метода): определить метод с помощью стандартного кода и передать «полезный» код через делегата:
public T DoMethod<T>( Func<T> mainCode, Func<Exception, T> exceptionHandlerCode)
{
Tracing.StartOfMethod("Repository");
try
{
return mainCode.Invoke();
}
catch (Exception ex)
{
ErrorSignal.FromCurrentContext().Raise(ex);
return exceptionHandlerCode.Invoke(ex);
}
finally
{
// sometimes something here
Tracing.EndOfMethod();
}
}
Который можно назвать, например, лямбдой:
DoMethod(() => { return 5; }, ex => { return 0; })