Я расскажу о шаблоне, который спас мой бекон в производственных условиях или двух.
Мотивация
Моя цель состоит в том, чтобы гарантировать, что бедный чувак (может быть, меня) который в полночь пытается решить билет sev1 поддержки, получает хорошую иерархию «вызвана» ошибками в следовать, в комплекте с данными, такими как идентификаторы, все без чрезмерного загромождения кода.
Метод
Для достижения этой цели, я ловлю все проверяемые исключения и повторно бросить их непроверенным исключения. Затем я использую глобальный захват на границе каждого из моих архитектурных слоев (обычно абстрагированных или инъецируемых, поэтому он только когда-либо записывается один раз). Именно в этих точках я могу добавить дополнительный контекст к стеку ошибок или решить, следует ли регистрировать и игнорировать, или создавать настраиваемое исключенное исключение с переменными для хранения любого дополнительного контекста. На в стороне, я только заносить ошибки в верхнем слое, чтобы остановить «двойной протоколирование» возникновения (например, задание хрон, контроллер пружинного для AJAX)
throw new RuntimeException(checked,"Could not retrieve contact " + id);
При таком подходе нет захламления вашего GUI или подписи метода бизнес-уровня путем объявления «бросков» для исключений, связанных с базой данных.
Пример того, как это работает в реальной жизни:
Допустим, работа моего кода является автоматизированный процесс, чтобы возобновить многие страховые полисы.Архитектура поддерживает графический интерфейс для ручного запуска обновления для одной политики. Также скажем, что почтовый индекс для рейтинговой области поврежден в БД для одной из этих политик.
Примером такого типа журнала ошибок я бы хотел достичь.
Log message: Flagging policy 1234 for manual intervention due to error:
From Stack Trace: Error Renewing Policy 1234. Rolling back the transaction ... This catch would also cover errors such as save errors, or generation of a letter.
From Stack Trace: Caused by: Error Rating Policy 1234 ... This catch would pickup errors retrieving many other objects, and algorithm errors such as NPE etc...
From Stack Trace: Caused by: Error Retrieving Rating Area 73932 ...
From Stack Trace: Caused by: JPA: unexpected null in field 'postcode'
Вы всегда должны улавливать уровень, когда можно справиться с ситуацией, в результате чего возникает исключение ... – ppeterka
Речь идет не о том или ином. Вы можете поймать исключения, сделать некоторую обработку, а затем восстановить их. Вы, вероятно, должны придумать конкретные примеры того, о чем вы думаете. Отправьте пример, рекомендованный здесь: http://www.sscce.org/ – dcaswell