Всегда ли атрибут javax.servlet.error.exception приводится к типу java.lang.Exception?

Атрибут javax.servlet.error.exception в запросе с типом диспетчера равен ERROR всегда можно привести к типу java.lang.Exception?

Я просматриваю javadoc, но в нем не упоминается, что тип должен быть java.lang.Exception ИЛИ java.lang.Throwable.

Я задаю этот вопрос, потому что я обрабатываю страницу с ошибкой. Если атрибут javax.servlet.error.exception всегда содержит тип Exception, я могу написать код, как показано ниже, не беспокоясь о ClassCastException во всех случаях.

Exception exception = (Exception) request.getAttribute("javax.servlet.error.exception");

Конечно, я могу сделать так:

Throwable error = (Throwable)request.getAttribute("javax.servlet.error.exception");

но моя обработка относится к типу Exception (не Throwable).

Спасибо!


person Loc    schedule 07.10.2015    source источник
comment
Я не уверен, что вы спрашиваете. ERROR_EXCEPTION_TYPE по предоставленной вами ссылке относится к типу String.   -  person Würgspaß    schedule 07.10.2015
comment
Спасибо! Я ввел неправильное имя атрибута. Я починил это.   -  person Loc    schedule 07.10.2015
comment
После вашего редактирования я все еще нахожу вопрос несколько вводящим в заблуждение: javax.servlet.error.exception - это постоянное значение RequestDispatcher.ERROR_EXCEPTION. Но вас, по-видимому, больше всего беспокоит поведение метода ServletRequest.getAttribute(String). И здесь в игру вступают web.xml и/или ServletRequest.setAttribute(String, Object).   -  person Würgspaß    schedule 07.10.2015
comment
@ Würgspaß: Но контейнер сервлета автоматически выполняет setAttribute для информации об исключении, когда контейнер выполняет отправку ERROR.   -  person Loc    schedule 07.10.2015
comment
Верно. В любом случае, в пользовательском коде сервера также может быть некоторый вызов setAttribute. Или даже кто-то собирается изменить настройку в web.xml в будущем. Итак, я бы подготовил свой код на всякий случай... В любом случае, на самом деле проблема заключается в getAttribute/setAttribute. Это была моя точка зрения здесь.   -  person Würgspaß    schedule 07.10.2015


Ответы (2)


Это зависит от <exception-type>, связанного с <error-page> записью в web.xml, <location> которой относится к рассматриваемому ресурсу на основе JSP/Servlet.

Если его нет, то есть вы используете общая страница ошибки без <exception-type>, или вы используете только <error-code>500</error-code>, или у вас вообще нет <error-page>, тогда предположим, что java.lang.Throwable.

Если есть явный <exception-type>, то предположим, что именно этот тип зарегистрирован в web.xml.

Другими словами, если вы хотите принять только java.lang.Exception, то установите <exception-type> соответственно этому типу.

<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/your-error-resource</location>
</error-page>

Помните, однако, что таким образом любой java.lang.Error (т.е. соответствующий java.lang.Throwable) проскользнет и попадет на страницу ошибки сервера по умолчанию, если у вас нет <error-page> для 500 или java.lang.Throwable.

Смотрите также:

person BalusC    schedule 07.10.2015

но моя цель - исключение

Вы можете использовать ERROR_EXCEPTION_TYPE, чтобы узнать тип, а затем получить объект, используя ERROR_EXCEPTION

String excType = request.getAttribute(RequestDispatcher.ERROR_EXCEPTION_TYPE);
if ("java.lang.Exception".equals(excType)) {
   Exception exception = (Exception) request.getAttribute(RequestDispatcher.ERROR_EXCEPTION);
   //....
}

Однако это все еще может поднять ClassCastException, если ServletRequest.setAttribute() используется, например, в озорных целях.

Если вы заботитесь и о других типах, вы можете использовать switch или отражение.

person Würgspaß    schedule 07.10.2015