Обработка исключений в веб-приложении Java

Я разрабатываю веб-приложение Java среднего размера с Struts как платформа MVC и простой JDBC на Уровне доступа к данным. Я искал лучшие практики обработки исключений в таком приложении. Я нашел несколько статей, некоторые из них являющийся противоречащим, только делая меня более смущенным вместо того, чтобы ясно дать понять вещи и простой. Некоторые говорят, что лучше снова использовать существующие исключения вместо того, чтобы определить специализированные исключения, другие представляют огромную иерархию специализированных исключений для каждой незначительной проблемы, которая может произойти в системе. Некоторые говорят, что лучше не обработать исключения на Уровне доступа к данным и делегировать их к Уровню служб, другие говорят, что исключения Уровня доступа к данным должны быть пойманы локально начиная с делегирования их к Уровню служб, нарушил бы абстракцию между этими двумя слоями. И так далее.

Я высоко ценил бы, если Вы сообщаете мне ссылок/имен на статьи/книги, что существующие твердые растворы, которые работали на Вас в таком сценарии. Решение должно очистить, по крайней мере, следующие моменты с выравниваниями:

  1. Где SQLExceptions быть пойманным?
  2. Где исключения должны быть зарегистрированы?
  3. Исключения непроверенные должны быть зарегистрированы?
  4. Исключения непроверенные должны быть пойманы на уровне представления, и их нужно показать пользователю?
  5. Как контролируемые исключительные ситуации быть обработанным, который из них, чтобы быть показанным пользователю и как?
  6. Как глобальная страница обработчика исключений должна использоваться?
  7. Как должен ходить с важным видом ActionErrors использоваться в этом контексте?

Спасибо

23
задан craftsman 30 January 2010 в 20:36
поделиться

3 ответа

1: Где ловятся исключения SQLExceptions?

В классах DAO на уровне доступа к данным. При необходимости вы можете обернуть его настраиваемым исключением DAO. Это исключение DAO, в свою очередь, необходимо обрабатывать как проверенное исключение.

2: Где должны регистрироваться исключения?

В тот момент, когда вы собираетесь выбросить их или передать через структуру обмена сообщениями.

3: Следует ли регистрировать непроверенные исключения?

Они обязательно должны регистрироваться. Они должны, в частности, не встречаться в реальном мире, потому что они являются признаком ошибки в логике кода (т.е. ошибки разработчика), которую необходимо исправить как можно скорее. Их следует перебросить до контейнера и позволить контейнеру обработать их с помощью в web.xml . Чтобы зарегистрировать (и, в конечном итоге, отправить по почте) их, используйте Фильтр , который прослушивает страницу с ошибкой.

4: Следует ли перехватывать непроверенные исключения на уровне представления и показывать ли их пользователю?

Они не должны возникать вообще.

5: Как обрабатывать проверенные исключения, какие из них показывать пользователю и как?

Если они являются результатом ошибочного ввода данных пользователем (например, не числа, неправильного адреса электронной почты, нарушения ограничений и т. Д.), Показать их в той же форме пользователю. В противном случае (например, DB не работает, исключение DAO и т. Д.) Либо перебросит его до страницы с ошибкой, либо отобразит ошибку с сообщением, чтобы повторить попытку позже.

6: Как следует использовать страницу глобального обработчика исключений?

По крайней мере, в удобной для пользователя форме. Таким образом, в том же макете, с некоторым вводным словом «извините» и, если необходимо, с некоторыми сведениями об ошибке и адресом электронной почты, чтобы пользователь мог связаться с ним по этому поводу.

7: Как следует использовать Struts ActionErrors в этом контексте?

Показывать их пользователю в той же форме.

20
ответ дан 29 November 2019 в 02:48
поделиться

Как предупреждение, при отображении сообщений об ошибках более низкого уровня пользователю, убедитесь, что они определяются системной информацией. Это область, где возникают многие безопасные эксплуатации. Зарегистрируйте их с полной информацией, но отображайте только более общее сообщение об ошибке для пользователя.

1
ответ дан 29 November 2019 в 02:48
поделиться

Если вы не можете восстановиться после исключения, вы должны позволить ему вытекать из вашего кода (часто путем снятия отметки или включения в непроверенное исключение). Если они остаются отмеченными, вы должны учитывать их на каждом уровне кода и, следовательно, на каждом уровне абстракции. SQLExceptions обычно попадают в эту категорию (вам придется заключать их в оболочку, поскольку они отмечены).

Для этих исключений я обычно регистрирую на самом высоком уровне, но представляю пользователям страницу, просто подробно описывающую, что что-то пошло не так. Обычно моих пользователей не интересуют трассировки стека. Но я обычно предлагаю им страницу, чтобы они могли описать, что они делали в то время, и зарегистрированное исключение связано с этим представлением через уникальный идентификатор (записанный в форме и в файле журнала за исключением). Это позволяет мне привязать действия пользователей к результирующему исключению.

Приведенное выше предполагает, что вы не можете восстановиться после SQLExceptions , а если база данных не работает, вы не можете сделать что-то значимое. Конечно, есть исключения. Вы можете обнаружить, что разговариваете с несколькими системами, и выход одной из них не означает, что вы не можете продолжать работу каким-либо образом (например, домашняя страница Amazon, как сообщается, полагается на 100 сервисов и должна работать независимо от того, вниз).

Я ожидаю, что объявленные исключения будут на том же уровне абстракции, что и интерфейс / методы, их определяющие. напримерБыло бы объявлено, что TradeStore генерирует исключение TradeException , а не SQLException (поскольку методы сохранения сделки являются реализацией TradeStore - вы можете хранить в реляционной базе данных, JavaSpace и т. д.).

4
ответ дан 29 November 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: