Всегда ли атрибут 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).

Спасибо!

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,

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

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

Ты можешь использовать 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 или отражение.

Другие вопросы по тегам