简介
在程序运行的过程中,难免会出现异常,如果我们没有做处理,那么前端页面显示的信息就会很不友好。在springMVC中提供了异常处理机制,通过注解就可以设置不同异常发生后,前端显示不同的信息。
局部异常
下面代码就会产生一个异常
@RequestMapping("/f1")
public String f1() {
int a = 1 / 0;
return "success";
}
看一下前端显示页面
下面就使用springmvc提供的异常处理来统一进行处理,需要写在当前的类里面
//改注解value里面写上想要捕获的异常
@ExceptionHandler({ArithmeticException.class})
public String handleException(Exception e, HttpServletRequest request) {
request.setAttribute("message", e.getMessage());
return "fail_exception";
}
}
创建一个错误提示页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>异常</title>
</head>
<body>
<h1>发生异常啦</h1>
<p>异常信息是:${message}</p>
</body>
</html>
再次访问,查看信息
可以发现友好了很多。注意:@ExceptionHandleer只会捕获当前类里面发生的异常,异常信息可以通过参数来进行获取
全局异常
上面的是局部异常,只能在一个类里面进行生效,下面来介绍全局异常。
@ControllerAdvice
public class GlobalException {
//捕获类型转换异常
@ExceptionHandler({NumberFormatException.class})
public String f(Exception e, HttpServletRequest request) {
request.setAttribute("message", e.getMessage());
return "fail_exception";
}
}
全局异常我们使用@ControllerAdvice进行标识,然后里面的方法还是用@ExceptionHandler进行标识,在这里的异常处理会对所有的Handler都生效。下面代码会抛出一个异常,看是否能够处理
@RequestMapping("/f2")
public String f2() {
int a = Integer.parseInt("abc");
return "success";
}
前端页面显示如下,可以进行捕获
有一点需要注意的是,异常捕获顺序是先在当前类里面标识@ExceptionHandler进行匹配,匹配不上再开始去@ControllerAdvice里面标识@ExceptionHandler进行匹配
自定义异常
我们还可以使用@ResponseStatus来进行自定义异常的捕获
@ResponseStatus(reason = "年龄必须在18以上...", code = HttpStatus.INTERNAL_SERVER_ERROR)
public class AgeException extends RuntimeException{
}
上面代码我们定义了一个异常,使用@ResponseStatus进行标识,reason就是标识异常的原因,code就是要返回给前端的状态码。
下面创建一个handler进行测试
@RequestMapping("/f3")
public String f3() {
if (1 > 0) {
throw new AgeException();
}
return "success";
}
前端页面显示如下
SimpleMappingExceptionResolver异常统一处理
我们可以直接在配置文件中配置不同的异常要跳转的视图
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.RuntimeException">fail_exception</prop>
<prop key="java.lang.ClassCastException">fail_exception</prop>
</props>
</property>
</bean>
这样配置之后不同的异常将会跳转到不同的视图
异常处理顺序
异常处理的顺序就是 局部异常 > 全局异常 > SimpleMappingExceptionResolver > tomcat默认异常处理机制
总结
异常处理使用比较简单,如果想了解原理,自行debug即可