Java 如何捕获JSP文件中的异常?

Java 如何捕获JSP文件中的异常?,java,spring,jsp,exception,exception-handling,Java,Spring,Jsp,Exception,Exception Handling,我使用ExceptionHandler在控制器中捕获异常 @ExceptionHandler(value = {Exception.class, RuntimeException.class}) public final ModelAndView globalExceptionHandler(final Exception exception) { ModelAndView modelAndView = new ModelAndView("error/500"); modelAn

我使用ExceptionHandler在控制器中捕获异常

@ExceptionHandler(value = {Exception.class, RuntimeException.class})
public final ModelAndView globalExceptionHandler(final Exception exception) {
    ModelAndView modelAndView = new ModelAndView("error/500");
    modelAndView.addObject("tl_exception", errorSystem.processingError(exception));
    return modelAndView;
}
但,例如,若在jsp文件中,我试图从空对象获取数据,那个么这不是一个例外

我需要建议,如何在jsp文件中捕获异常?或者我只需要在控制器中捕捉所有错误

更新:

最好的解决方案是将错误放在web.xml uri中

<error-page>
    <location>/error</location>
</error-page>

有一些选择

首先,您可以使用web.xml捕获某些特定类型的异常(或使用java.lang.Throwable捕获所有异常),例如添加以下内容:

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

java.lang.Throwable
/error.jsp
或:


java.lang.arithmetricException
/error.jsp

另一种方法是使用@ExceptionHandler注释,请查找更多添加到@astrohome-answer,
JSP
还提供了为每个JSP指定错误页面的选项。每当页面抛出异常时,JSP容器就会自动调用错误页面

要设置错误页面,请使用
指令

在上面提到的错误处理JSP中,包含指令

例如,假设您有一个JSP页面名
main.JSP
,您正试图对其执行空对象操作

main.jsp

<%@ page errorPage="show-error.jsp" %>

<html>
<head>
   <title>Page on which Error Occurs</title>
</head>
<body>

</body>
</html>
<%@ page isErrorPage="true" %>
<html>
<head>
<title>Show Error</title>
</head>
<body>
<p>Exception stack trace:<% exception.printStackTrace(response.getWriter()); %>
</p>
</body>
</html>

发生错误的页面
显示错误.jsp

<%@ page errorPage="show-error.jsp" %>

<html>
<head>
   <title>Page on which Error Occurs</title>
</head>
<body>

</body>
</html>
<%@ page isErrorPage="true" %>
<html>
<head>
<title>Show Error</title>
</head>
<body>
<p>Exception stack trace:<% exception.printStackTrace(response.getWriter()); %>
</p>
</body>
</html>

显示错误
异常堆栈跟踪:


如果您只想重定向到错误页面,astrohome和Arpit提出的解决方案很好

如果你真的想抓住它们并能做任何事情,你还有两种方法:

  • 过滤器。声明自定义筛选器

    public class exceptFilter implements Filter {
        ...
        @Override
        public void doFilter(ServletRequest req, ServletResponse res,
                FilterChain chain) throws IOException, ServletException
            try {
                fc.doFilter(req, resp);
            }
            catch (Exception ex) {
                // Exception processing ...
            }
        }
        ...
    }
    
    但是请注意,当您捕获异常时,响应可能已经提交

  • 实现一个
    HandlerExceptionResolver
    bean。您将在-it中找到它的引用,它或多或少像一个全局的
    @ExceptionHandler
    ,但它甚至会在控制器动作之前和之后动作


  • 您使用的是JSP标准标记库吗?更干净的方法;当将此页面提供给用户时,还可以将其存根为:System.out.println(exception.toString());-这样,他们只看到英文消息,而您在日志中有自己的调试信息。