【问题标题】:How I can catch exception in JSP files?如何在 JSP 文件中捕获异常?
【发布时间】:2018-03-23 17:39:43
【问题描述】:

我使用 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 文件中我想从空对象获取数据,那是异常而不是 cathcing。

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

更新:

最好的解决方案是放在 web.xml uri 中以防出错。

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

创建处理请求错误所需的控制器后:

@Controller
public final class ErrorController {
    @RequestMapping(value = "/error")
    public final ModelAndView globalErrorHandle(final HttpServletRequest request) {
       String page = "error/500";
       final String code = request.getAttribute("javax.servlet.error.status_code").toString();
       if (null != code && !code.isEmpty()) {                
            final Integer statusCode = Integer.parseInt(code);
            switch (statusCode) {
                case 404 : page = "error/404";
                case 403 : page = "error/403";
            }
        }
        return new modelAndView(page);
    }
}

【问题讨论】:

标签: java spring jsp exception exception-handling


【解决方案1】:

除了@astrohome 答案之外,JSP 还为您提供了为每个 JSP 指定错误页面的选项。每当页面抛出异常时,JSP 容器都会自动调用错误页面。

要设置错误页面,请使用&lt;%@ page errorPage="xxx" %&gt; 指令。

您在上面提到的错误处理 JSP 中包含指令 &lt;%@ page isErrorPage="true" %&gt;

例如,假设您有一个 JSP 页面名称 main.jsp,您尝试在该页面上对空对象执行操作。

ma​​in.jsp

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

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

</body>
</html>

show-error.jsp

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

【讨论】:

  • 更清洁的方法;并且当将此页面提供给用户时,您还可以像这样存根它: System.out.println(exception.toString()); - 这样他们只能看到英文消息,而您在日志中有自己的调试信息。
【解决方案2】:

有一些选择。

首先,你可以使用web.xml来捕捉一些指定类型(或全部使用java.lang.Throwable)的异常,例如添加这个:

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

或:

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

另一种方式是使用@ExceptionHandler注解,更多请找here

【讨论】:

    【解决方案3】:

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

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

    1. 过滤器。声明一个自定义过滤器

      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 ...
              }
          }
          ...
      }
      

      但请注意,当您捕获异常时,响应可能已经提交...

    2. 实现HandlerExceptionResolver bean。您可以在 Spring Framework Reference Manual 中找到它的引用 - 它或多或少类似于全局 @ExceptionHandler,但它甚至会在控制器操作之前或之后起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 2021-03-26
      • 2013-09-04
      • 2021-05-23
      • 2023-03-31
      相关资源
      最近更新 更多