Я разрабатываю веб-приложение Java среднего размера с Struts как платформа MVC и простой JDBC на Уровне доступа к данным. Я искал лучшие практики обработки исключений в таком приложении. Я нашел несколько статей, некоторые из них являющийся противоречащим, только делая меня более смущенным вместо того, чтобы ясно дать понять вещи и простой. Некоторые говорят, что лучше снова использовать существующие исключения вместо того, чтобы определить специализированные исключения, другие представляют огромную иерархию специализированных исключений для каждой незначительной проблемы, которая может произойти в системе. Некоторые говорят, что лучше не обработать исключения на Уровне доступа к данным и делегировать их к Уровню служб, другие говорят, что исключения Уровня доступа к данным должны быть пойманы локально начиная с делегирования их к Уровню служб, нарушил бы абстракцию между этими двумя слоями. И так далее.
Я высоко ценил бы, если Вы сообщаете мне ссылок/имен на статьи/книги, что существующие твердые растворы, которые работали на Вас в таком сценарии. Решение должно очистить, по крайней мере, следующие моменты с выравниваниями:
Спасибо
1: Где ловятся исключения SQLExceptions?
В классах DAO на уровне доступа к данным. При необходимости вы можете обернуть его настраиваемым исключением DAO. Это исключение DAO, в свою очередь, необходимо обрабатывать как проверенное исключение.
2: Где должны регистрироваться исключения?
В тот момент, когда вы собираетесь выбросить
их или передать через структуру обмена сообщениями.
3: Следует ли регистрировать непроверенные исключения?
Они обязательно должны регистрироваться. Они должны, в частности, не встречаться в реальном мире, потому что они являются признаком ошибки в логике кода (т.е. ошибки разработчика), которую необходимо исправить как можно скорее. Их следует перебросить до контейнера и позволить контейнеру обработать их с помощью
в web.xml
. Чтобы зарегистрировать (и, в конечном итоге, отправить по почте) их, используйте Фильтр
, который прослушивает страницу с ошибкой.
4: Следует ли перехватывать непроверенные исключения на уровне представления и показывать ли их пользователю?
Они не должны возникать вообще.
5: Как обрабатывать проверенные исключения, какие из них показывать пользователю и как?
Если они являются результатом ошибочного ввода данных пользователем (например, не числа, неправильного адреса электронной почты, нарушения ограничений и т. Д.), Показать их в той же форме пользователю. В противном случае (например, DB не работает, исключение DAO и т. Д.) Либо перебросит его до страницы с ошибкой, либо отобразит ошибку с сообщением, чтобы повторить попытку позже.
6: Как следует использовать страницу глобального обработчика исключений?
По крайней мере, в удобной для пользователя форме. Таким образом, в том же макете, с некоторым вводным словом «извините» и, если необходимо, с некоторыми сведениями об ошибке и адресом электронной почты, чтобы пользователь мог связаться с ним по этому поводу.
7: Как следует использовать Struts ActionErrors в этом контексте?
Показывать их пользователю в той же форме.
Как предупреждение, при отображении сообщений об ошибках более низкого уровня пользователю, убедитесь, что они определяются системной информацией. Это область, где возникают многие безопасные эксплуатации. Зарегистрируйте их с полной информацией, но отображайте только более общее сообщение об ошибке для пользователя.
Если вы не можете восстановиться после исключения, вы должны позволить ему вытекать из вашего кода (часто путем снятия отметки или включения в непроверенное исключение). Если они остаются отмеченными, вы должны учитывать их на каждом уровне кода и, следовательно, на каждом уровне абстракции. SQLExceptions
обычно попадают в эту категорию (вам придется заключать их в оболочку, поскольку они отмечены).
Для этих исключений я обычно регистрирую на самом высоком уровне, но представляю пользователям страницу, просто подробно описывающую, что что-то пошло не так. Обычно моих пользователей не интересуют трассировки стека. Но я обычно предлагаю им страницу, чтобы они могли описать, что они делали в то время, и зарегистрированное исключение связано с этим представлением через уникальный идентификатор (записанный в форме и в файле журнала за исключением). Это позволяет мне привязать действия пользователей к результирующему исключению.
Приведенное выше предполагает, что вы не можете восстановиться после SQLExceptions
, а если база данных не работает, вы не можете сделать что-то значимое. Конечно, есть исключения. Вы можете обнаружить, что разговариваете с несколькими системами, и выход одной из них не означает, что вы не можете продолжать работу каким-либо образом (например, домашняя страница Amazon, как сообщается, полагается на 100 сервисов и должна работать независимо от того, вниз).
Я ожидаю, что объявленные исключения будут на том же уровне абстракции, что и интерфейс / методы, их определяющие. напримерБыло бы объявлено, что TradeStore
генерирует исключение TradeException
, а не SQLException
(поскольку методы сохранения сделки являются реализацией TradeStore
- вы можете хранить в реляционной базе данных, JavaSpace и т. д.).