С тех пор, как Microsoft представила блоки приложений, я столкнулся с людьми, которые используют Блок приложений для обработки исключений. Недавно я поближе познакомился и подвел основные функции следующим образом (пропустите следующий блок, если вы уже знаете, что он делает):
Блок приложений обработки исключений направлен на централизацию и полную настройку с конфигурационными файлами следующих ключевых задач обработки исключений:
- Регистрация исключения
- Замена исключения
- Обтекание исключений
- Распространение исключения
- и др.
В библиотеке это делается путем изменения блоков catch try следующим образом:
try { // Run code. } catch(DataAccessException ex) { bool rethrow = ExceptionPolicy.HandleException(ex, "Data Access Policy"); if (rethrow) { throw; } }
В зависимости от того, что указано в app.config для имени политики (см. здесь для документов), HandleException будет либо...
- вывести совершенно новое исключение (заменить исходное исключение)
- обернуть исходное исключение в новом и выбросить его
- усвоить исключение (т.е. ничего не делать)
- Восстановите исходное исключение.
Кроме того, вы также можете настроить его для выполнения большего количества материалов (например, журнал исключения).
Теперь вот моя проблема: я полностью не понимаю, как это может быть полезно, чтобы настроить ее, заменялось ли исключение, обертывание, проглатывание или повторное включение. По моему опыту, это решение должно быть принято в момент написания кода, потому что вам придется изменить окружающий или вызывающий код при изменении поведения обработки исключений.
Например, ваш код, скорее всего, начнет вести себя некорректно, когда вы переконфигурируете так, что конкретное исключение, созданное в определенной точке, теперь проглочено вместо повторного (может быть, код после блока catch, который не должен выполняться, когда исключение имеет место). То же самое касается всех других возможных изменений в обработке исключений (например, replace → rethrow, swallow → wrap).
Итак, для меня суть в том, что блок обработки исключений решает проблемы, которые на самом деле не существуют на практике. Исключительный журнал и бит уведомления хороши, но не все ли другие являются прекрасным примером для overengineering?