Устранение повторяющегося кода 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 + различные политики.

Я рекомендую это? Точно сказать не могу. Я посмотрел на их реализацию и в итоге использовал некоторые из их концепций. Я сказал себе, что вернусь к этому, но у меня еще не было шанса.

Другие вопросы по тегам