SpringBoot全局异常出处理
一、关键注解@ControllerAdvice@ExceptionHandler
二、自定义异常三、全局异常统一处理
一、关键注解
@ControllerAdvice
@ControllerAdvice是springmvc controller增强器。可以实现一些在原来的Controller中实现不了或者是重复的功能抽取。
@ExceptionHandler
@ExceptionHandler是spring里面的一个注解,非常方便去掉try...catch这类冗余难看的代码,有利于代码的整洁和优美。还能统一处理异常,是个非常好的技巧。
配合@ControllerAdvice 或者是@RestControllerAdvice 可以实现全局异常拦截。
二、自定义异常
我们自定义的异常必须继承一个异常父类,比如RuntimeException 或者直接继承Exception。 包括状态码和信息两个字段,getset方法,有参无参构造。 如下:
package com
.lsh
.exception
;
public class DelFastDFSFileException extends RuntimeException{
private static final long serialVersionUID
= 907335315335226691L
;
private int code
;
private String message
;
public static long getSerialVersionUID() {
return serialVersionUID
;
}
public int getCode() {
return code
;
}
public void setCode(int code
) {
this.code
= code
;
}
@Override
public String
getMessage() {
return message
;
}
public void setMessage(String message
) {
this.message
= message
;
}
public DelFastDFSFileException() {
}
public DelFastDFSFileException(int code
, String message
) {
this.code
= code
;
this.message
= message
;
}
}
三、全局异常统一处理
package com
.lsh
;
import com
.lsh
.exception
.DelFastDFSFileException
;
import com
.lsh
.unit
.ResultObject
;
import org
.springframework
.web
.bind
.annotation
.ControllerAdvice
;
import org
.springframework
.web
.bind
.annotation
.ExceptionHandler
;
import org
.springframework
.web
.bind
.annotation
.ResponseBody
;
@ControllerAdvice
public class BaseExceptionHandler {
@ExceptionHandler(value
= ArrayIndexOutOfBoundsException
.class)
@ResponseBody
public ResultObject
error(ArrayIndexOutOfBoundsException e
){
e
.printStackTrace();
return new ResultObject("500", "请选择上传文件", e
.getMessage());
}
@ExceptionHandler(value
= DelFastDFSFileException
.class)
@ResponseBody
public ResultObject
error2(DelFastDFSFileException e
){
e
.printStackTrace();
return new ResultObject("501", "文件删除失败", e
.getMessage());
}
}
# ResultObject:
package com
.lsh
.unit
;
public class ResultObject {
private String code
;
private String msg
;
private Object data
;
public String
getCode() {
return code
;
}
public void setCode(String code
) {
this.code
= code
;
}
public String
getMsg() {
return msg
;
}
public void setMsg(String msg
) {
this.msg
= msg
;
}
public Object
getData() {
return data
;
}
public void setData(Object data
) {
this.data
= data
;
}
@Override
public String
toString() {
return "ResultObject [code=" + code
+ ", msg=" + msg
+ ", data=" + data
+ "]";
}
public ResultObject(String code
, String msg
, Object data
) {
super();
this.code
= code
;
this.msg
= msg
;
this.data
= data
;
}
public ResultObject() {
super();
}
}
经过这样子处理以后,我们在代码中直接抛出异常,不用trycatch捕获, 也可以统一捕获进行处理,简洁了代码。