1.问题描述(本问题是基于SpringMVC框架产生的)
自定义的异常处理器没有捕获到Controller层抛出的异常,而是直接抛给浏览器
2.问题探索
2.1 Controller层代码如下
package com.huang.controller;
import com.huang.exception.LoginException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class UserController {
@RequestMapping("/find")
public void find(){
try{
int i =1 / 0;
}catch (Exception e){
throw new LoginException("除数为零");
}
}
}
2.2 自定义异常类如下
package com.huang.exception;
public class LoginException extends RuntimeException{
private String message;
@Override
public String getMessage() {
return message;
}
public LoginException() {
super();
}
public LoginException(String message) {
this.message = message;
}
public LoginException(String message, Throwable cause) {
super(message, cause);
}
public LoginException(Throwable cause) {
super(cause);
}
protected LoginException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
2.3 异常处理器如下
package com.huang.exception;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
String message = ex.getMessage();
ModelAndView mav = new ModelAndView();
mav.addObject("message",message);
mav.setViewName("error");
return mav;
}
}
2.4 跳转错误页面如下
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>系统异常!</p>
<p>异常信息为:${message}</p>
</body>
</html>
起初觉得这样写是完全没有问题的,当异常发生之后是可以捕获异常,并跳转到指定页面。但事与愿违,无论怎么修改都是直接在浏览器端报500
3.问题解决
在网上寻找了一系列的解决方法之后,我坚信我的逻辑肯定没问题,于是乎可能是我的配置文件出了问题。果然功夫不负有心人
我忘了在web.xml中配置spting-mvc.xml的路径!
正确的web.xml配置文件应是如下所示
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--配置DispatcherServlet -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!--配置dispatcherServlet的映射路径为 / 包含全部的servlet, JSP除外-->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
正确显示结果: