Как избежать дублирования блоков 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' - "Ориентированное на аспект программирования". В Интернете есть более похожие методы.
Ответ 3
Поскольку вы упомянули, что используете WCF, вы можете реализовать интерфейс IErrorHandler, и все исключения будут перенаправлены на ваш метод, где вы можете их зарегистрировать.
Ответ 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;
});
}
Не помню точно, это было какое-то время. Но похоже на это.