在SpringMVC中 异常处理...
-
基本介绍
1.SpringMVC 通过 HandlerExceptionResolver 处理程序的异常,包括 Handler 映射、数据绑定以及目标方法执行时发生的异常。
2.主要处理Handler 中用 @ExceptionHandler 注解定义的方法.
3.ExceptionHandlerMethodResolver 内部若是找不到 @ExceptionHandler 注解的话,会找 @ControllerAdvice 类的 @ExceptionHandler 注解方法,这样就相当于一个全局处理器。
局部异常...
- 代码演示...
1.前端页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>异常信息</title>
</head>
<body>
<h1>测试异常</h1>
<h3><a href="<%=request.getContextPath()%>/testException01?num=2">点击测试局部异常</a></h3>
</body>
</html>
2.局部处理异常页...
@Controller
public class MyExceptionHandler {
/**
*1、localException 方法处理局部异常
*2、这里处理的异常是:ArithmeticException、NullPointerException
*3、Exception ex:生成的异常对象,会传递给ex,通过ex可以得到相关信息,
* 这里程序员也可以加入自己的业务逻辑
* @param ex
* @param request
* @return
*/
@ExceptionHandler({ArithmeticException.class,NullPointerException.class})
public String localException(Exception ex, HttpServletRequest request){
System.out.println("异常信息是--" + ex.getMessage());
//将异常信息带到下一个页面
//可以根据自己的要求进行更改
request.setAttribute("reason",ex.getMessage());
return "exception_mes";
}
//该方法是用来进行相关测试。
@RequestMapping(value = "/testException01")
public String test01(Integer num){
int i = 9/num;
return "success";
}
}
3.解释:通过 @ExceptionHandler 该注解中定义的,可以将捕获到 test01()所反馈的异常信息。
若是处理的异常存在则返回客户端准备的失败 exception_mes.jsp页面。
全局异常处理...
1.全局异常类的处理需要在添加 @ControllerAdvice 进行注解,当加入该注解后就表示是一个全局处理的异常。
2.全局异常不管哪个 Handler 抛出的异常都能进行捕获。
案例:
前端页面也可以使用局部异常的前端页面中添加相关代码。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>异常信息</title>
</head>
<body>
<h1>测试异常</h1>
<h3><a href="<%=request.getContextPath()%>/testException01?num=2">点击测试局部异常</a></h3>
<h3><a href="<%=request.getContextPath()%>/testGlobalException">点击测试全局异常</a></h3>
</body>
</html>
在类中使用 @ControllerAdvice注解 进行注释,表示该类是一个全局异常处理类。
mport org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
/**
* @ControllerAdvice 全局异常处理器
*/
@ControllerAdvice
public class MyGlobalException {
//全局异常就不管是哪个 Handler 抛出的异常,都可以捕获
@ExceptionHandler({NumberFormatException.class,ClassCastException.class,NumberFormatException.class})
public String localException(Exception ex, HttpServletRequest request){
System.out.println("全局信息异常= " + ex.getMessage());
//将异常信息带到下一个页面
request.setAttribute("reason",ex.getMessage());
return "exception_mes";
}
@RequestMapping(value="/testGlobalException")
public String global(){
int num = Integer.parseInt("hello");
return "success";
}
}
解读:
自定义异常...
1.通过 @ResponseStatus 注解,可以进行自定义异常处理。
代码案例:(以先前 前端页面代码为例)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>异常信息</title>
</head>
<body>
<h1>测试异常</h1>
<h3><a href="<%=request.getContextPath()%>/testException01?num=2">点击测试局部异常</a></h3>
<h3><a href="<%=request.getContextPath()%>/testG">点击测试全局异常</a></h3><br/>
<h3><a href="<%=request.getContextPath()%>/testException02">则是自定义异常</a></h3><br/>
</body>
</html>
抛出自定义异常方法所在的公共类...
@Controller
public class MyExceptionHandler {
@ExceptionHandler({ArithmeticException.class,NullPointerException.class})
public String localException(Exception ex, HttpServletRequest request){
System.out.println("异常信息是--" + ex.getMessage());
//将异常信息带到下一个页面
//可以根据自己的要求进行更改
request.setAttribute("reason",ex.getMessage());
return "exception_mes";
}
@RequestMapping(value = "/testException01")
public String test01(Integer num){
int i = 9/num;
return "success";
}
@RequestMapping(value = "/testException02")
public String test02(){
//这里可以使用到带参构造器进行遗产信息的返回。
throw new AgeException("年龄必须要在1-120线之间");
}
}
自定义异常的异常处理类。
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
/**
* 通过 @ResponseStatus 注解来标注的一个异常类
*/
@ResponseStatus(reason = "年龄必须在1-120之间",value = HttpStatus.BAD_REQUEST)
public class AgeException extends RuntimeException{
//无参构造器
public AgeException() {
}
//属性构造器
public AgeException(String message) {
super(message);
}
}
注解:在异常方法中我们已经异常抛出去 ,在专门处理异常的类中进行对异常的捕获,再将异常信息传送回前端页面,如下图:
SimpleMappingExceptionResolver 对所有异常的统一处理!!
- 基本说明
1.如果希望对所有的异常进行统一处理,可以使用 SimpleMappingExceptionResolver..
2.它将异常类名映射为视图名,即发生异常时使用对应的视图报告异常
3.需要在Spring的ioc容器中进行配置。
下面 ’傻鱼‘ 就和大家开始为大家进行演示!!!
代码演示:
1.首先设计出一条需要处理的异常信息(数组越界异常)。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
@Controller
public class MyExceptionHandler {
@RequestMapping (value = "/testException03")
public String test03(){
int[] ints = new int[]{1,2,34,5};
System.out.println(ints[90]);
return "success";
}
}
2.在Spring的ioc文件中配置 SimpleMappingExceptionResolver
<!--配置统一处理异常信息-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!--这句话指定需要处理的异常信息,,,arrEx需要返回的处理页面-->
<prop key="java.lang.ArrayIndexOutOfBoundsException">arrEx</prop>
</props>
</property>
</bean>
这句话指定需要处理的异常信息,arrEx.jsp 需要返回的处理页面。。也可以直接挂异常的父类
Exception 这样就会将所有的异常进行捕获!!
<prop key="java.lang.ArrayIndexOutOfBoundsException">arrEx</prop>
3.异常出现后返回的异常页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>未知异常信息</title>
</head>
<body>
<h1>朋友,系统发生了未知异常~请联系网站管理者 -傻鱼辣椒-</h1>
</body>
</html>
异常处理的优先级....
局部异常 > 全局异常 > SimpleMappingExceptionResolver > tomcat默认机制
你若自己足够努力,神明都会庇佑于你。