Я бы согласился с другим постером о ловушках чрезмерного проектирования для удобства обслуживания (или любой другой причине, которую вы предвидите в будущем) - для меня это редко окупалось, что означало, что в любом случае я должен был когда-нибудь изменить дизайн в будущем. Я использовал обработку и обработку исключений в разных слоях, когда работал над крупным корпоративным приложением - монолитное приложение с похожей многоуровневой архитектурой, а журналы приложений были кошмаром для анализа.
Я предполагаю, что вы не используете исключения для управления поток приложения, который является анти-шаблоном.
Из моего опыта исключение должно обрабатываться ответственным уровнем, а результат должен возвращаться в соответствии с 'контрактом' с вызывающими уровнями. Это делает очень плотный интерфейс между уровнями, и исключение генерируется нижним уровнем, когда согласованный интерфейс не соблюдается (например, IllegalArgument)
В случае, если обработка исключения не может привести к правильному возвращенному результату (например, База данных соединение потеряно), тогда generi c 'Layer Exception' может быть сгенерировано уровнем, обрабатывающим исключение (например, 'DataAccessError', сгенерированный Data Layer) Это исключение должно быть поймано только тем уровнем, который может вернуть результат верхним уровням в соответствии с контрактом, иначе не должен обрабатываться. В конечном счете, в этом случае слой Presentation будет корректно обрабатывать исключение.
Какой бы слой ни обрабатывал исключение, он также должен регистрировать его, и в вашем случае вам нужен только способ различения guish в журналах. из какой строки журнала слоя происходит, так что для приведенного выше примера журнал будет выглядеть примерно так ...
[PRESENTATION] Error displaying Product Info: DataAccessLayerError - Error fetching Product info for ID 123.
...
...
[DATA] Error fetching Product info for ID 123:
/stack trace of caught DB Connection Error/
Это в сочетании с печатью Контекст потока (или эквивалент в вашей структуре ведения журнала) упростит отслеживание ошибок в ваших лог-файлах.