servlet发生异常时如何重定向到错误页面?

Posted

技术标签:

【中文标题】servlet发生异常时如何重定向到错误页面?【英文标题】:How to redirect to error page when exception occurs from servlet? 【发布时间】:2015-01-04 05:35:02 【问题描述】:

我正在编写一个 servlet,如果发生任何异常,我不想在浏览器上显示异常/错误消息,所以我将重定向到我自定义的错误页面。所以我这样做了:

protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException 
try
    //Here is all code stuff
catch(Exception e)

  request.getRequestDispatcher("/ErrorPage.jsp").forward(request, response);
  e1.printStackTrace();


这是正确的方法吗,如果我错了,请纠正我,如果有更好的机制,请告诉我。

【问题讨论】:

重复***.com/q/7066192 在您的 sn-p 和下面的答案中执行 forward() 至少是错误的。如果您真的想以编程方式执行此操作,则应该使用 sendError(),而不是 forward()。 【参考方案1】:

以通用方式处理它的唯一方法是使用web.xml,如下所示:

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

servlet 被抛出ServletExceptionIOException,但如果您想在单个异常处理程序中处理运行时异常和所有其他异常,您可以提供异常类型为Throwable。您可以使用多个错误页面条目来处理不同类型的异常并具有不同的处理程序。

示例:

@WebServlet("/ErrorHandler")
public class ErrorHandler extends HttpServlet 
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException 
        processError(request, response);
    

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException 
        processError(request, response);
    
    private void processError(HttpServletRequest request,
            HttpServletResponse response) throws IOException 
        //customize error message
        Throwable throwable = (Throwable) request
                .getAttribute("javax.servlet.error.exception");
        Integer statusCode = (Integer) request
                .getAttribute("javax.servlet.error.status_code");
        String servletName = (String) request
                .getAttribute("javax.servlet.error.servlet_name");
        if (servletName == null) 
            servletName = "Unknown";
        
        String requestUri = (String) request
                .getAttribute("javax.servlet.error.request_uri");
        if (requestUri == null) 
            requestUri = "Unknown";
            
        request.setAttribute("error", "Servlet " + servletName + 
          " has thrown an exception " + throwable.getClass().getName() +
          " : " + throwable.getMessage());    
        request.getRequestDispatcher("/ErrorPage.jsp").forward(request, response);
    

【讨论】:

谢谢你,那么现在catch 块和ErrorHandler Servlet 应该是什么?你能用小示例代码告诉我吗? 在catch块中你可以转发到/ErrorHandler而不是错误页面。我发布的错误处理 servlet 示例。 哦。 .谢谢你,&我如何在jsp页面中打印statusCodethrowable对象。 $statusCode$throwable 我没有得到 jsp 中的值,但是如果我在 out.prinln() 的 servlet 中打印它,这些值会被打印出来。【参考方案2】:

以通用方式处理它的一种方法是使用 web.xml,如下所示:

<error-page>
    <exception-type>java.io.IOException</exception-type >
    <location>/ErrorHandler</location>
</error-page>

我刚刚包含了 IO 异常,但您可能会说 SQLException 您可以很好地添加另一个错误页面和另一个位置。同样,您可以说 java.lang.Exception 类型和一个处理所有事情的处理程序。

【讨论】:

我使用的是最新版本的 servlet,所以我没有使用 web.xml,所以如何在我的项目中进行配置。 添加一个web.xml怎么样?【参考方案3】:

在某些方法中,您将拥有以下内容:

try 
  // something
 catch (Exception e) 
  sendErrorRedirect(req, res, "/errorpage.jsp", e);


// then....  sendErrorRedirect looks like this:
  protected void sendErrorRedirect(HttpServletRequest request, HttpServletResponse response, String errorPageURL, Throwable e) 
      try 
            request.setAttribute ("javax.servlet.jsp.jspException", e);
            getServletConfig().getServletContext().getRequestDispatcher(errorPageURL).forward(request, response);
       catch (Exception ex) 
            putError("serXXXXX.sendErrorRedirect ", ex);
      
  

【讨论】:

谢谢你,这是一个servlet,v可以写这样的方法,但我们不能为每个servlet写这个方法rt?我有很多 servlet。

以上是关于servlet发生异常时如何重定向到错误页面?的主要内容,如果未能解决你的问题,请参考以下文章

处理asp.net核心中的异常?

如果发生数据库错误,如何将页面重定向到其他页面

异步控制器操作中发生错误时重定向用户

javascript 加载的局部视图 MVC 中发生错误时重定向到错误页面

Sentry 捕获错误时重定向到新页面

从 servlet 重定向到 html 时出现 404 错误