В даний час я переробляю велику підсистему з багатошаровою архітектурою, і я намагаюся створити ефективну стратегію реєстрації помилок \ обробку.
Скажімо, моя архітектура складається з наступних трьох шарів:
- Загальнодоступний інтерфейс (IE і контролер MVC)
- Шар домену
- Шар доступу до даних
Моє джерело плутанини - це те, де мені слід застосувати журнал помилок \ обробку:
Найпростішим рішенням було б здійснити ведення журналів на верхньому рівні (IE the Public Interface \ MVC Controller). Однак це відчуває себе неправильно, оскільки це означає перемикання винятку через різні шари, а потім його реєстрацію; а не записувати виняток у своєму джерелі.
Реєстрація винятку в його джерелі, очевидно, найкраще рішення, оскільки я маю найбільше інформації. Моя проблема з цим полягає в тому, що я не можу зловити кожен виняток у джерелі, не вловивши ВСІ винятки, а в шарі домену / загальнодоступного інтерфейсу це призведе до вилучення виключень, які вже були схоплені, записані та повторно кинуті шаром нижче .
Інша можлива стратегія - це поєднання №1 та №2; внаслідок чого я вловлюю конкретні винятки на шарі, які вони, швидше за все, будуть кинуті (IE Ловля, ведення журналів та повторне закидання
SqlExceptions
в рівень доступу до даних), а потім реєструю будь-які подальші невиконані винятки на верхньому рівні. Однак це також вимагає від мене вибору та повторного перегляду кожного винятку на найвищому рівні, тому що я не можу розрізнити помилки, які вже були введені \ обробляються, та тими, що не мають.
Очевидно, це проблема в більшості програмних додатків, тому повинно бути стандартне рішення цієї проблеми, яке призводить до того, що винятки можуть бути схоплені у джерелі та записані один раз; однак я просто не бачу, як це зробити самостійно.
Зауважте, заголовок цього питання дуже схожий на " Журнал винятків у багаторівневій програмі" ", проте відповіді в цій публікації недостатньо деталізовані і недостатньо, щоб відповісти на моє запитання.
The easiest solution would be to implement the logging at the top level
- зробити це. Реєструвати винятки в їх джерелі - це не дуже гарна ідея, і кожна програма, з якою я стикався, робила це налагодження PITA. За поводження з винятками повинно бути відповідальність за абонента.
try{ ... } catch(Exception ex) { Log(ex); }
призведе до того, що на кожному шарі буде записано однаковий виняток. (Також видається досить поганою практикою ловити всі винятки на кожному шарі в кодовій базі.)