springboot定义全局异常

tech2025-05-31  12

本篇文章接着上一篇文章编写,上一篇参考

springboot 定义统一返回结果

如何在springboot中定义全局异常:

首先在枚举类中添加全局异常代码

package com.example.demo.base; /** * 响应码枚举 */ public enum ResultCode { SUCCESS("200"), //成功 FAIL("400"), //失败 UNAUTHORIZED("401"), //未认证(签名错误) NOT_FOUND("404"), //接口不存在 INTERNAL_SERVER_ERROR("500"), //服务器内部错误 EXCEPTION_ERROR("-1");//全局异常 private final String code; ResultCode(String code) { this.code = code; } public String code() { return code; } }

在统一返回结果的工具类中添加异常返回的公共方法

package com.example.demo.base; /** * 响应结果生成工具 */ public class ResultUtil { private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS"; public static Result genSuccessResult() { Result result = new Result(); result.setCode(ResultCode.SUCCESS.code()); result.setMsg(DEFAULT_SUCCESS_MESSAGE); return result; } public static <T> DateResult<T> genSuccessResult(T data) { DateResult<T> dateResult = new DateResult<T>(); dateResult.setCode(ResultCode.SUCCESS.code()); dateResult.setMsg(DEFAULT_SUCCESS_MESSAGE); dateResult.setResult(data); return dateResult; } public static Result genExceptionResult(String msg) { Result result = new Result(); result.setCode(ResultCode.EXCEPTION_ERROR.code()); result.setMsg(msg); return result; } }

需要写一个自定义异常处理类,继承RuntimeException

package com.example.demo.base; public class CommonException extends RuntimeException { private String msg; private String code; public CommonException(String msg) { super(msg); this.msg = msg; code = ResultCode.EXCEPTION_ERROR.code(); } public CommonException(String msg, Throwable cause) { super(msg, cause); this.msg = msg; code = ResultCode.EXCEPTION_ERROR.code(); } public CommonException(String code, String msg) { super(msg); this.code = code; this.msg = msg; } public CommonException(String code, String msg, Throwable cause) { super(msg, cause); this.code = code; this.msg = msg; } 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; } }

使用ExceptionHandler 捕获相应的异常

package com.example.demo.base; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @RestControllerAdvice public class BaseException { protected Logger logger = LoggerFactory.getLogger(getClass()); @ExceptionHandler({ CommonException.class }) public Result handleAeException(CommonException e) { return ResultUtil.genExceptionResult("系统异常,异常信息为:" + e.getMessage()); } @ExceptionHandler({ Exception.class }) public Result handleException(Exception e) { return ResultUtil.genExceptionResult("系统异常,异常信息为:" + e.getMessage()); } @ExceptionHandler({ RuntimeException.class }) public Result handleException(RuntimeException e) { return ResultUtil.genExceptionResult("系统异常,异常信息为:" + e.getMessage()); } }

Controller类处理如下:

package com.example.demo.controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.example.demo.base.CommonException; import com.example.demo.base.DateResult; import com.example.demo.base.Result; import com.example.demo.base.ResultUtil; import com.example.demo.entity.User; @RestController @RequestMapping("/user") public class UserController { @PostMapping("/update") public Result updateUser(@RequestParam Integer id) { //为了测试,这个故意让程序进入异常 int i = 1 / 0; return ResultUtil.genSuccessResult(); } @RequestMapping("/detail") public DateResult<User> queryUser(@RequestParam Integer id) { try { //为了测试,这个故意让程序进入异常 int i = 1 / 0; } catch (Exception e) { throw new CommonException("全局异常测试"); } User user = new User(); user.setId(10); user.setName("张三"); user.setEmil("1234456@qq.com"); user.setAddress("测试地址"); return ResultUtil.genSuccessResult(user); } }

测试结果如下:

 

代码链接

最新回复(0)