我有一个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惜售。
你不应该赶上并抑制它,只是让他走。
即不这样做:
@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
今天我有同样的问题。 (7的JavaEE和Glassfish 4.0)
这个问题似乎是,该框架与类检查它作为字符串代替。
基于字符串的检查(假设)
当一个异常被twrown, e.getClass()
与比较<exception-type>
作为字符串。 所以你不能使用继承。
需要注意的是嵌套类必须指出的“$”,而不是“” (同的getClass()方法)。
基于类的检查
该框架创建该类的一个实例,并<exception-type>
文本引用它,并且class.isInstance()
用于检查。
这将需要反思和政策文件可以打破它。
我希望这个响应解决未来的问题。