SpringBoot中自定义异常以及全局异常的统一处理

tech2025-04-29  20

SpringBoot全局异常出处理

一、关键注解@ControllerAdvice@ExceptionHandler 二、自定义异常三、全局异常统一处理

一、关键注解

@ControllerAdvice

@ControllerAdvice是springmvc controller增强器。可以实现一些在原来的Controller中实现不了或者是重复的功能抽取。

@ExceptionHandler

@ExceptionHandler是spring里面的一个注解,非常方便去掉try...catch这类冗余难看的代码,有利于代码的整洁和优美。还能统一处理异常,是个非常好的技巧。

配合@ControllerAdvice 或者是@RestControllerAdvice 可以实现全局异常拦截。

二、自定义异常

我们自定义的异常必须继承一个异常父类,比如RuntimeException 或者直接继承Exception。 包括状态码和信息两个字段,getset方法,有参无参构造。 如下:

package com.lsh.exception; /** * @author :LiuShihao * @date :Created in 2020/9/3 9:45 上午 * @desc : */ 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捕获, 也可以统一捕获进行处理,简洁了代码。

最新回复(0)