经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring » 查看文章
springboot下添加全局异常处理和自定义异常处理
来源:cnblogs  作者:Scotyzh  时间:2023/12/13 9:12:12  对本文有异议

前言

在spring项目中,优雅处理异常,好处是可以将系统产生的全部异常统一捕获处理,自定义的异常也由全局异常来捕获,如果涉及到validator参数校验器使用全局异常捕获也是较为方便。

相关代码:

GlobalExceptionHandler类:

  1. @Slf4j
  2. @RestControllerAdvice
  3. public class GlobalExceptionHandler {
  4. /********************************
  5. * @function : 自定义从捕捉
  6. * @parameter : [e:CustomException | 自定义异常]
  7. * @date : 2023/12/5 11:47
  8. ********************************/
  9. @ExceptionHandler(value = CustomException.class)
  10. public AjaxResult customExceptionHandler(HttpServletRequest request, CustomException e) {
  11. log.error("业务异常,url:{}, 异常内容:{}" ,request.getRequestURI(), e);
  12. return new AjaxResult(e.getCode() , e.getMessage(), null);
  13. }
  14. /********************************
  15. * @function : 空指针异常捕捉
  16. * @parameter : [e:Exception | 异常]
  17. * @date : 2023/12/5 11:47
  18. ********************************/
  19. @ExceptionHandler(value = Exception.class)
  20. public AjaxResult exceptionHandler(HttpServletRequest request, Exception e) {
  21. log.error("服务器内部异常异常,url:{}, 异常内容:{}" ,request.getRequestURI(), e);
  22. return new AjaxResult(500 , e.getMessage(), null);
  23. }
  24. }

自定义异常CustomException类:

  1. @Slf4j
  2. @Data
  3. public class CustomException extends RuntimeException{
  4. //错误码
  5. private int code;
  6. //错误信息
  7. private String message;
  8. public CustomException() {
  9. super();
  10. }
  11. public CustomException(ResultCodeEnum resultCodeEnum) {
  12. super(String.valueOf(resultCodeEnum.getCode()));
  13. this.code = resultCodeEnum.getCode();
  14. this.message = resultCodeEnum.getMessage();
  15. }
  16. }

通用返回类:AjaxResult

  1. @Data
  2. public class AjaxResult extends HashMap<String, Object> {
  3. // 状态码
  4. private static final String CODE_TAG = "code";
  5. // 返回消息
  6. private static final String MSG_TAG = "message";
  7. // 数据对象
  8. private static final String DATA_TAG = "data";
  9. public AjaxResult(int code, String message, Object data)
  10. {
  11. super.put(CODE_TAG, code);
  12. super.put(MSG_TAG, message);
  13. if (data != null)
  14. {
  15. super.put(DATA_TAG, data);
  16. }
  17. }
  18. /********************************
  19. * @method : success
  20. * @function : 返回成功消息(重载)
  21. * @parameter :
  22. * @return : AjaxResult
  23. ********************************/
  24. public static AjaxResult success(){
  25. return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(), null);
  26. }
  27. /********************************
  28. * @method : success
  29. * @function : 返回成功消息(重载)
  30. * @parameter : message : String | 返回消息
  31. * @return : AjaxResult
  32. ********************************/
  33. public static AjaxResult success(String message){
  34. return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), message, null);
  35. }
  36. /********************************
  37. * @method : success
  38. * @function : 返回成功消息(重载)
  39. * @parameter : data : Object | 数据对象
  40. * @return : AjaxResult
  41. ********************************/
  42. public static AjaxResult success(Object data){
  43. return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(), data);
  44. }
  45. /********************************
  46. * @method : success
  47. * @function : 返回成功消息(重载)
  48. * @parameter : message : String | 返回消息
  49. * @parameter : data : Object | 数据对象
  50. * @return : AjaxResult
  51. ********************************/
  52. public static AjaxResult success(String message, Object data){
  53. return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), message, data);
  54. }
  55. /********************************
  56. * @method : failed
  57. * @function : 返回失败消息(重载)
  58. * @parameter :
  59. * @return : AjaxResult
  60. ********************************/
  61. public static AjaxResult failed(){
  62. return new AjaxResult(ResultCodeEnum.FAILED.getCode(), ResultCodeEnum.FAILED.getMessage(), null);
  63. }
  64. /********************************
  65. * @method : failed
  66. * @function : 返回失败消息(重载)
  67. * @parameter : message : String | 返回消息
  68. * @return : AjaxResult
  69. ********************************/
  70. public static AjaxResult failed(String message){
  71. return new AjaxResult(ResultCodeEnum.FAILED.getCode(), message, null);
  72. }
  73. /********************************
  74. * @method : failed
  75. * @function : 返回失败消息(重载)
  76. * @parameter : resultCodeEnum : ResultCodeEnum | 失败枚举类型
  77. * @return : AjaxResult
  78. ********************************/
  79. public static AjaxResult failed(ResultCodeEnum resultCodeEnum){
  80. return new AjaxResult(resultCodeEnum.getCode(), resultCodeEnum.getMessage(), null);
  81. }
  82. /********************************
  83. * @method : failed
  84. * @function : 返回失败消息(重载)
  85. * @parameter : message : String | 返回消息
  86. * @parameter : data : Object | 数据对象
  87. * @return : AjaxResult
  88. ********************************/
  89. public static AjaxResult failed(String message, Object data){
  90. return new AjaxResult(ResultCodeEnum.FAILED.getCode(), message, data);
  91. }
  92. /********************************
  93. * @method : failed
  94. * @function : 返回失败消息(重载)
  95. * @parameter : resultCodeEnum : ResultCodeEnum | 失败枚举类型
  96. * @parameter : data : Object | 数据对象
  97. * @return : AjaxResult
  98. ********************************/
  99. public static AjaxResult failed(ResultCodeEnum resultCodeEnum, Object data){
  100. return new AjaxResult(resultCodeEnum.getCode(), resultCodeEnum.getMessage(), data);
  101. }
  102. }

枚举类ResultCodeEnum:

  1. public enum ResultCodeEnum {
  2. // 10??? 通用
  3. SUCCESS(10000,"请求成功"),
  4. FAILED(10008, "请求失败"),
  5. FAILED_PARAM_ERROR(10009, "参数错误"),
  6. ...
  7. private Integer code;
  8. private String message;
  9. ResultCodeEnum(Integer code, String message) {
  10. this.code = code;
  11. this.message = message;
  12. }
  13. public int getCode(){
  14. return code;
  15. }
  16. public String getMessage(){
  17. return message;
  18. }
  19. }

使用:

在controller里面判断值是否异常,如果异常则直接抛出异常不进行执行,终止当前的流程,在service层也可以这样处理。

  1. public AjaxResult getUserInfo(@RequestParam(value = "userId") Integer userId) {
  2. if userId == 0) {
  3. throw new CustomException(ResultCodeEnum.NOT_EXIST_USER_ERROR);
  4. }
  5. ...
  6. }

再者是一些数值上的错误,比如除0,这种情况会被全局异常捕获,并返回相应的错误给到前端

  1. @GetMapping("/test")
  2. public AjaxResult test(){
  3. int i = 60/0;
  4. return AjaxResult.success();
  5. }

原文链接:https://www.cnblogs.com/scottyzh/p/17895032.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号