В настоящее время я занимаюсь рефакторингом большой подсистемы с многоуровневой архитектурой и изо всех сил стараюсь разработать эффективную стратегию регистрации и обработки ошибок.
Допустим, моя архитектура состоит из следующих трех слоев:
- Открытый интерфейс (IE контроллер MVC)
- Уровень домена
- Уровень доступа к данным
Мой источник путаницы - то, где я должен реализовать регистрацию ошибок \ обработку:
Самым простым решением было бы реализовать ведение журнала на верхнем уровне (IE Public Interface \ MVC Controller). Однако это кажется неправильным, потому что это означает всплытие исключения через разные слои, а затем запись его; вместо того, чтобы регистрировать исключение в его источнике.
Регистрация исключения в его источнике, очевидно, является лучшим решением, потому что у меня больше информации. Моя проблема в том, что я не могу перехватить каждое исключение в источнике без перехвата ВСЕХ исключений, а на уровне домена / общедоступного интерфейса это приведет к отлову исключений, которые уже были перехвачены, зарегистрированы и повторно выброшены нижним уровнем ,
Другой возможной стратегией является сочетание № 1 и № 2; в результате чего я ловлю определенные исключения на уровне, они, скорее всего, будут выброшены (IE Catching, logging and re-throwing
SqlExceptions
в уровне доступа к данным), а затем записываю любые дальнейшие необработанные исключения на верхнем уровне. Однако это также потребовало бы от меня перехватывать и регистрировать каждое исключение на верхнем уровне, потому что я не могу отличить ошибки, которые уже были зарегистрированы / обработаны, от ошибок, которые не были.
Очевидно, что это проблема большинства программных приложений, поэтому должно существовать стандартное решение этой проблемы, которое приводит к тому, что исключения регистрируются у источника и регистрируются один раз; однако я просто не вижу, как это сделать сам.
Обратите внимание, что заголовок этого вопроса очень похож на « Регистрация исключений в многоуровневом приложении» , однако в ответах на этот пост не хватает подробностей, и их недостаточно для ответа на мой вопрос.
The easiest solution would be to implement the logging at the top level
- сделай это. Регистрация исключений в их источнике не является хорошей идеей, и каждое приложение, с которым я столкнулся, выполняло это для отладки PITA. Ответственность за обработку исключений должна лежать на вызывающей стороне.
try{ ... } catch(Exception ex) { Log(ex); }
приведет к тому, что одно и то же исключение будет зарегистрировано на каждом слое. (Также кажется довольно плохой практикой