如果不处理异常, 对用户非常的不友好。
创建springmvc\src\com\web\exception\MyExceptionHandler.java
@Controller
public class MyExceptionHandler {
/**
* 1. localException 方法处理局部异常
* 2. 这里处理ArithmeticException.class,NullPointerException.class类型的异常
* 3. Exception ex: 生成的异常对象,会传递给ex, 通过ex可以得到相关的异常信息,这里程序员可以加入自己的业务逻辑
*/
@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";
}
/**
* 1. 编写方法,模拟异常, 算术异常
* 2. 如果我们不做异常处理,是由tomcat默认页面显示
*/
@RequestMapping(value = "/testException01")
public String test01(Integer num) {
int i = 9 / num;
return "success";
}
}
创建springmvc\web\exception.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
异常信息
测试异常
点击测试异常
创建显示异常信息页面/WEB-INF/pages/exception_mes.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
异常信息提示
朋友, 程序发生了异常...
异常信息- ${requestScope.reason}
浏览器输入http://localhost:8080/springmvc/exception.jsp
感兴趣的可以debug一下源码。
演示全局异常处理机制, ExceptionHandlerMethodResolver 内部若找不到@ExceptionHandler 注解的话,会找@ControllerAdvice 类的@ExceptionHandler 注解方法,这样就相当于一个全局异常处理器。
创建springmvc\src\com\web\exception\MyGlobalException.java
// 如果类上标注了@ControllerAdvice,就是一个全局异常处理类
@ControllerAdvice
public class MyGlobalException {
/**
* 1. 全局异常就不管是哪个Handler抛出的异常,都可以捕获 , @ExceptionHandler({异常类型})
* 2. 这里处理的全局异常是NumberFormatException.class,ClassCastException.class
* 3. Exception ex 接收抛出的异常对象
*/
@ExceptionHandler({NumberFormatException.class, ClassCastException.class})
public String globalException(Exception ex, HttpServletRequest request) {
System.out.println("全局异常处理-" + ex.getMessage());
//如何将异常的信息带到下一个页面.
request.setAttribute("reason", ex.getMessage());
return "exception_mes";
}
}
修改MyExceptionHandler.java , 增加方法
@RequestMapping(value = "/testGlobalException")
public String global(){
//1. 这里我们模拟了一个异常 NumberFormatException
//2. 该异常没有在局部异常处理,按照异常处理机制,就会交给全局异常处理类处理
int num = Integer.parseInt("hello");
return "success";
}
修改exception.jsp
点击测试异常
点击测试全局异常
浏览器输入http://localhost:8080/springmvc/exception.jsp
通过@ResponseStatus 注解, 可以自定义异常的说明。
创建springmvc\src\com\web\exception\AgeException.java
@ResponseStatus(reason="年龄需要在1-120 之间",value= HttpStatus.BAD_REQUEST)
public class AgeException extends RuntimeException{
}
修改MyExceptionHandler.java, 增加方法
//抛出自定义异常
@RequestMapping(value="/testException02")
public String test02(){
throw new AgeException();
}
修改exception.jsp, 增加超链接
点击测试全局异常
点击测试自定义异常
浏览器输入http://localhost:8080/springmvc/exception.jsp
对数组越界异常进行统一处理,使用SimpleMappingExceptionResolver.
//统一的异常
@RequestMapping(value="/testException03")
public String test03(){
int[] arr = new int[]{3,9,10,190};
System.out.println(arr[90]);
return "success";
}
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.ArrayIndexOutOfBoundsException">arrExprop>
props>
property>
bean>
<mvc:annotation-driven>mvc:annotation-driven>
<mvc:default-servlet-handler/>
创建/WEB-INF/pages/arrEx.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
数组越界了
数组越界了~
测试统一的异常[SimpleMappingExceptionResolver]
浏览器输入http://localhost:8080/springmvc/exception.jsp
对未知异常进行统一处理,使用SimpleMappingExceptionResolver。
//如果发生了没有归类的异常, 可以给出统一提示页面
@RequestMapping(value="/testException04")
public String test04(){
String str = "hello";
char c = str.charAt(10);
return "success";
}
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.ArrayIndexOutOfBoundsException">arrExprop>
<prop key="java.lang.Exception">allExprop>
props>
property>
bean>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
未知异常信息
朋友,系统发生了未知异常~
测试统一的异常[SimpleMappingExceptionResolver]
统一未归类异常
浏览器输入http://localhost:8080/springmvc/exception.jsp
局部异常> 全局异常> SimpleMappingExceptionResolver > tomcat 默认机制。