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