在web.xml标签不赶java.lang.Throwable的异常( tag in

2019-08-22 05:33发布

我有一个servlet的JSP和开发的web应用程序。 我配置我的应用程序抛出IllegalArgumentException如果我插入错误参数。 然后我配置了我的web.xml文件中这样说:

<error-page>
    <error-code>404</error-code>
    <location>/error.jsp</location>
</error-page>
<error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/error.jsp</location>
</error-page>

当我升到一个404 error ,那么它的工作原理,并调用error.jsp ,但是当我升到一个java.lang.IllegalArgumentException ,那么它不工作,我有一个blank page ,而不是error.jsp 。 为什么?

该服务器是GlassFish和日志显示真正抛出:IllegalArgumentException惜售。

Answer 1:

你不应该赶上并抑制它,只是让他走。

即不这样做:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        doSomethingWhichMayThrowException();
    } catch (IllegalArgumentException e) {
        e.printStackTrace(); // Or something else which totally suppresses the exception.
    }
}

而只是让他走:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doSomethingWhichMayThrowException();
}

或者,如果你真的intented抓住它的日志左右(我宁愿使用一个过滤器,但ALA),然后重新抛出:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        doSomethingWhichMayThrowException();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
        throw e;
    }
}

或者,如果它不是一个运行时异常,然后重新抛出它裹在ServletException ,它会自动由容器解开:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        doSomethingWhichMayThrowException();
    } catch (NotARuntimeException e) {
        throw new ServletException(e);
    }
}

也可以看看:

  • 如何服务器的优先级要使用哪种类型的web.xml错误页面的?
  • https://stackoverflow.com/questions/9739472/what-to-do-with-exceptions-why-and-when-does-doget-method-throw-servletexcept/9746657#9746657


Answer 2:

今天我有同样的问题。 (7的JavaEE和Glassfish 4.0)

这个问题似乎是,该框架与类检查它作为字符串代替。

基于字符串的检查(假设)

当一个异常被twrown, e.getClass()与比较<exception-type>作为字符串。 所以你不能使用继承。

需要注意的是嵌套类必须指出的“$”,而不是“” (同的getClass()方法)。

基于类的检查

该框架创建该类的一个实例,并<exception-type>文本引用它,并且class.isInstance()用于检查。

这将需要反思和政策文件可以打破它。

我希望这个响应解决未来的问题。



文章来源: tag in web.xml doesn't catch java.lang.Throwable Exceptions