Когда можно создать исключение ServletException из сервлета? - PullRequest
16 голосов
/ 08 мая 2009

В прошлом я бросал ServletException с, когда в сервлете что-то / что-то идет не так, в основном это просто исключение в ServletException.

Теперь я думаю, что на самом деле лучше не бросать ServletException, а отвечать response.sendError(sc) и использовать правильные коды состояния HTTP.

Если я не могу отправить ошибку, используя reponse.sendError, (IOException), я обертываю IOException в ServletException.

Вышеуказанный лучший способ ответить? Когда можно просто бросить ServletException?

Ответы [ 2 ]

23 голосов
/ 06 марта 2012

Я только что пришел к противоположному выводу @alamar. Моя ситуация - написание сервлета в стиле REST, который будет вызываться кодом в базе данных Oracle, а не людьми.

Я хочу вернуть HTTP-код 400 Bad Request вызывающей стороне, когда информация о запросе неверна или отсутствует. Бросок ServletException заставляет контейнер возвращать 500 Внутренняя ошибка сервера , в которой говорится, что с сервером что-то не так, а не с запросом.

Вот решение, которое я принял.

  1. Создать простой класс исключений RequestException, который расширяет Exception.
  2. Проверить правильность запроса с помощью метода (ов), которые выдают new RequestException(message).
  3. Поймать RequestException в методе сервлета doPost и вызвать HttpServletResponse.sendError() следующим образом:

    try {
        validateRequest(request);
        // Do stuff with a valid request.
    } catch (RequestException e) {
        response.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
    }
    

Сообщение возвращается вызывающей стороне, как если бы оно было ServletException.

9 голосов
/ 08 мая 2009

Лучше скинуть ServletException.

Позже вы можете фактически поймать это исключение с помощью директивы error-page в вашем web.xml и выполнить соответствующие действия: отобразить страницу с причудливой ошибкой для пользователя, отправить исключение вместе с трассировкой стека разработчикам, записать его в журналы и и так далее.

Если вы просто используете sendError(), вы не сможете сделать это в различной степени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...