2009-05-08 3 views
16

Я бросал ServletException в прошлом, когда что-то или что-то пошло не так в сервлете, в основном просто обертывая исключение в ServletException.Когда это нормально бросать ServletException из сервлета?

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

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

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

ответ

21

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

Я хочу вернуть код HTTP 400 Неверный запрос вызывающему абоненту, когда информация запроса недействительна или отсутствует. Бросок 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.

+1

Какая ошибка HTTP 'IOException' вызывает возврат контейнера? – ADTC

+3

@ADTC Быстрый эксперимент показывает, что Tomcat 7 throws _500 Internal Server Error_ для 'IOException', как и для' ServletException'. Я не знаю, соответствует ли это по спецификации или по соглашению. – pharsicle

8

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

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

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

+0

Я действительно забыл об этом, в прошлом я делал то же самое на веб-сайтах. В настоящий момент я использую сервлет для создания простой веб-службы XML, поэтому в этом контексте нет страницы для показа. Спасибо за напоминание! –

+1

@alamar, вы подробно остановитесь на своем подходе? Возможно, поместите какой-нибудь код? Мне особенно любопытно, что бит, который маршрутизирует стек и записывает в журнал. – craig

+0

@craig вы должны посмотреть [error-page web.xml] вверх – alamar

Смежные вопросы