Устранение повторяющегося кода try/catch
Написание кода, который должен обрабатывать одни и те же исключения снова и снова, постоянно становится скучным.
Есть ли способ написать код без try/catch и добавить атрибуты в метод, чтобы перехватывать (и обрабатывать) различные исключения, которые могут возникнуть? Это звучит как AOP (Postsharp), это было бы идеальным решением?
Поэтому я хочу написать классы, которые могут определять, где / как регистрируется, повторно генерируется исключение и т. Д., И они происходят из атрибутов и любого базового класса / интерфейса. А затем повторно используйте их и примените к различным методам в коде. Это значительно улучшит последовательность.
Спасибо
3 ответа
Похоже, вы ищете функциональность, которую может предоставить AOP. В зависимости от того, к чему вы конкретно стремитесь, вы можете получить много одинаковых преимуществ без дополнительных затрат, просто написав несколько вспомогательных методов, как предлагает Питер О..
Лично я не нахожу, что у меня много повторяющихся кодов обработки исключений из-за того, что исключения... ну... исключительные. Они не должны быть частью нормального потока кода, и, если нет ничего особенного, что необходимо сделать в ответ на конкретный тип исключения, лучшая политика, как правило, вообще не перехватывает их, по крайней мере, до тех пор, пока они не возникнут. на высоком уровне, где вы хотите войти в них.
Я бы предложил написать методы, которые принимают делегатов (таких как Func и Action) в качестве аргументов. Делегаты будут представлять блок "try". Отдельные методы будут обрабатывать исключения, которые возникают внутри делегатов по-разному.
Пример:
OverflowHandler(delegate(){ checked{ x+=200; } });
где метод OverflowHandler будет обрабатывать OverflowException и, вероятно, будет регистрировать и перебрасывать другие исключения.
Вот пример того, как может выглядеть метод OverflowHandler:
public void OverflowHandler(Action func){
try {
func(); // call the delegate
} catch(Exception e){
if(e is OverflowException){
// handle the overflow exception
} else {
// log exception and rethrow
LogException(e);
throw;
}
}
}
Вот кое-что из команды MS Practices и Patterns.
Введение в блок приложения обработки исключений http://msdn.microsoft.com/en-us/library/ff664698(v=PandP.50).aspx
определенно, у них есть концепция rethrow + различные политики.
Я рекомендую это? Точно сказать не могу. Я посмотрел на их реализацию и в итоге использовал некоторые из их концепций. Я сказал себе, что вернусь к этому, но у меня еще не было шанса.