简介
在实际项目开发中,总会出现各种各样的异常信息,如:ArithmeticException
、NullpointException
还有自定义异常
等。
当出现异常时,往往直接发往了客户端,导致数据整体格式显示异常和不美观的现象,如果优雅的显示或返回异常信息,这种操作很关键。
测试案例
本次测试采取Springboot版本为:2.1.14.RELEASE
。
依赖引入
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.14.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 阿里巴巴json -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.44</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
定义一个请求类
@RestController
public class ExceptionController {
@RequestMapping("/testEX")
public String testEX() {
int a = 10/0;
return "success";
}
}
请求测试
直接白板显示报错信息,不够美观。增加全局异常配置拦截过滤,当有异常时,返回异常信息。
配置全局异常
@RestControllerAdvice
//@ControllerAdvice //根据需要监测的controller上的注解区分使用
public class ExceptionAdvice{
@ExceptionHandler(value = ArithmeticException.class)
public String arithmeticException(Exception e) {
return "出现异常,异常信息为:"+e;
}
}
这样的提示信息,相比之前的白板,就幽雅美观了很多。其次还能自定义异常操作。
自定义异常
public class MyException extends RuntimeException {
private static final long serialVersionUID = -261801339539851004L;
private String errMsg;
public String getErrMsg() {
return errMsg;
}
public void setErrMsg(String errMsg) {
this.errMsg = errMsg;
}
public MyException(String errMsg) {
super();
this.errMsg = errMsg;
}
}
至于继承RuntimeException
还是继承Exception
都没什么关系。
然后定义一个请求接口,针对某些请求抛出异常信息。
@RequestMapping("/testEX2")
public String testEX2(String name) {
if("11".equals(name)) {
throw new MyException("出现异常了。。。。");
}
return "success";
}
当然,不加全局异常捕获,一样出现白板提示界面。
增加一个异常全局监控
,捕获全局异常信息(或指定异常),返回重要的信息。
@ExceptionHandler(value = MyException.class)
public String myException(MyException e) {
return "出现MyException,异常信息为:"+e.getErrMsg();
}
请求异常测试:
结语
正常来说,开发采取前后分离方式,会采取json方式实现数据的交互传输,在全局异常信息中,返回json信息也可以,此处为了方便理解,未添加json返回类型。