Подтвердить что ты не робот

Когда можно бросить ServletException из сервлета?

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

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

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

Является ли выше способ ответа? Когда это нормально, просто нажмите ServletException?

4b9b3361

Ответ 1

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

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

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

  • Создайте простой класс исключений RequestException, который расширяет Exception.
  • Проверьте правильность запроса с помощью методов (методов), которые бросают new RequestException(message).
  • Поймайте 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.

Ответ 2

Лучше бросить ServletException.

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

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