gpt4 book ai didi

jsp - 尽管在 web.xml 中配置了异常类型,但仍未显示错误页面

转载 作者:行者123 更新时间:2023-11-28 21:53:49 25 4
gpt4 key购买 nike

主题:Servlets 和 JSP,声明式异常处理

我在 web.xml 中创建了以下错误声明

<error-page>
<exception-type>exercises.MyException</exception-type>
<location>/WEB-INF/errors/error.jsp</location>
</error-page>

然后我创建了 MyException 类

public class MyException extends Exception {
public static int JustThrowError(int n) throws MyException{
if(n<10)
throw new MyException();
else
return n;
}
}

为了对此进行测试,我使用了一个简单的 jsp。

<body>
<%@ page import="exercises.*" %>
<%=MyException.JustThrowError(9) %>
</body>

我预计它会显示在我的 web.xml 中指定的错误页面 (error.jsp)。相反,我得到异常堆栈跟踪,如下所示。

谁能解释为什么没有捕获异常并将其重定向到我的 web.xml 中定义的 error.jsp?

SEVERE: Servlet.service() for servlet [jsp] in context with path [/my-struts-errors] threw exception [An exception occurred processing JSP page /forms/riskyPage.jsp at line 9

6: </head>
7: <body>
8: <%@ page import="exercises.*" %>
9: <%=MyException.JustThrowError(9) %>
10: </body>
11: </html>


Stacktrace:] with root cause
exercises.MyException
at exercises.MyException.JustThrowError(MyException.java:8)
at org.apache.jsp.forms.riskyPage_jsp._jspService(riskyPage_jsp.java:63)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:417)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:383)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:288)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)

最佳答案

我猜您的问题是 Tomcat 将您的异常包装在 org.apache.jasper.JasperException(在 JspServletWrapper.handleJspException 中)中。要对此进行测试,请尝试更改为:

<error-page>
<exception-type>org.apache.jasper.JasperException</exception-type>
<location>/WEB-INF/errors/error.jsp</location>
</error-page>

我敢打赌这行得通,放置诸如 java.lang.Throwable 之类的父类(super class)也行得通。 (但这显然不是针对您的特定问题的解决方案)。

您可以在 error.jsp 中获取异常,所以我想您可以将异常类型相关的逻辑放在那里。

但是,一般来说 - 使用 scriptlet 是一种不好的做法(请参阅 jsp for business layer 了解其中的一些原因)。我认为您从标记或 servlet(或其他“中间层”代码)中抛出异常,它不会包装在 JasperException 中,因此会按您预期的那样工作。 (我会在某个时候对此进行调查,然后编辑我的答案 - 除非其他人在评论中确认任何一种方式)。

关于jsp - 尽管在 web.xml 中配置了异常类型,但仍未显示错误页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12542514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com