Java全局异常处理-自定义异常处理

悠悠 2024-03-26 22:58 215阅读 0赞

哈喽!大家好,我是旷世奇才李先生
文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】更有我为大家准备的福利哟,回复【项目】获取我为大家准备的项目

文章目录

  • 一、Java异常是什么
    • 1、简介
  • 二、创建全局异常处理类以及自定义异常处理类
    • 1、自定义异常处理类
    • 2、创建全局异常处理类
  • 三、总结

相关阅读

  • 面试官:Zookeeper是什么,它有什么特性与使用场景?
  • 面试官:Redis如何实现持久化的、主从哨兵又是什么?

一、Java异常是什么

1、简介

异常是指程序在运行过程中发生的,由于外部问题导致的程序运行异常事件,异常的发生往往会中断程序的运行。在 Java 这种面向对象的编程语言中,万物都是对象,异常本身也是一个对象,程序发生异常就会产生一个异常对象。

二、创建全局异常处理类以及自定义异常处理类

1、自定义异常处理类

有人会问为什么我们java中有异常会报错,我们直接去处理不就好了,为什么还需要去自定义异常处理类呢,因为java中的报错只有我们程序员能看懂,用户并看不懂,比如登录的时候用户名不存在,这个时候我们需要自定义一个用户不存在的提示给用户看,这样用户就知道自己的用户名输入错误了。

  1. package com.heima.common.exception;
  2. import com.heima.model.common.enums.AppHttpCodeEnum;
  3. public class CustomException extends RuntimeException {
  4. private AppHttpCodeEnum appHttpCodeEnum;
  5. public CustomException(AppHttpCodeEnum appHttpCodeEnum){
  6. this.appHttpCodeEnum = appHttpCodeEnum;
  7. }
  8. public AppHttpCodeEnum getAppHttpCodeEnum() {
  9. return appHttpCodeEnum;
  10. }
  11. }

在这里我们使用枚举将我们常用的一些提示信息进行了封装。

  1. package com.heima.model.common.enums;
  2. public enum AppHttpCodeEnum {
  3. // 成功段固定为200
  4. SUCCESS(200,"操作成功"),
  5. // 登录段1~50
  6. NEED_LOGIN(1,"需要登录后操作"),
  7. LOGIN_PASSWORD_ERROR(2,"密码错误"),
  8. // TOKEN50~100
  9. TOKEN_INVALID(50,"无效的TOKEN"),
  10. TOKEN_EXPIRE(51,"TOKEN已过期"),
  11. TOKEN_REQUIRE(52,"TOKEN是必须的"),
  12. // SIGN验签 100~120
  13. SIGN_INVALID(100,"无效的SIGN"),
  14. SIG_TIMEOUT(101,"SIGN已过期"),
  15. // 参数错误 500~1000
  16. PARAM_REQUIRE(500,"缺少参数"),
  17. PARAM_INVALID(501,"无效参数"),
  18. PARAM_IMAGE_FORMAT_ERROR(502,"图片格式有误"),
  19. SERVER_ERROR(503,"服务器内部错误"),
  20. // 数据错误 1000~2000
  21. DATA_EXIST(1000,"数据已经存在"),
  22. AP_USER_DATA_NOT_EXIST(1001,"ApUser数据不存在"),
  23. DATA_NOT_EXIST(1002,"数据不存在"),
  24. // 数据错误 3000~3500
  25. NO_OPERATOR_AUTH(3000,"无权限操作"),
  26. NEED_ADMIND(3001,"需要管理员权限");
  27. int code;
  28. String errorMessage;
  29. AppHttpCodeEnum(int code, String errorMessage){
  30. this.code = code;
  31. this.errorMessage = errorMessage;
  32. }
  33. public int getCode() {
  34. return code;
  35. }
  36. public String getErrorMessage() {
  37. return errorMessage;
  38. }
  39. }

可以看到我们这里对用户名密码错误都进行了自定义提示。

2、创建全局异常处理类

上面的自定义异常处理类我们还需要在全局异常处理类中使用。

  1. package com.heima.common.exception;
  2. import com.heima.model.common.dtos.ResponseResult;
  3. import com.heima.model.common.enums.AppHttpCodeEnum;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.springframework.web.bind.annotation.ControllerAdvice;
  6. import org.springframework.web.bind.annotation.ExceptionHandler;
  7. import org.springframework.web.bind.annotation.ResponseBody;
  8. @ControllerAdvice //控制器增强类
  9. @Slf4j
  10. public class ExceptionCatch {
  11. /**
  12. * 处理不可控异常
  13. * @param e
  14. * @return
  15. */
  16. @ExceptionHandler(Exception.class)
  17. @ResponseBody
  18. public ResponseResult exception(Exception e){
  19. e.printStackTrace();
  20. log.error("catch exception:{}",e.getMessage());
  21. return ResponseResult.errorResult(AppHttpCodeEnum.SERVER_ERROR);
  22. }
  23. /**
  24. * 处理可控异常 自定义异常
  25. * @param e
  26. * @return
  27. */
  28. @ExceptionHandler(CustomException.class)
  29. @ResponseBody
  30. public ResponseResult exception(CustomException e){
  31. log.error("catch exception:{}",e);
  32. return ResponseResult.errorResult(e.getAppHttpCodeEnum());
  33. }
  34. }

在这里插入图片描述

在这里我们要着重记住两个注解就是 @ControllerAdvice 和 @ExceptionHandler 因为@ControllerAdvice 配合 @ExceptionHandler 才能实现全局异常处理,@ControllerAdvice是加在全局异常处理类上,而 @ExceptionHandler 是加在对应的处理方法上。

在这里我们处理两种异常,一种是不可控的异常,一种是可控的异常,可控的异常就在@ExceptionHandler后面加上我们自定义的异常处理类即可

三、总结

项目涉及的功能还是比较全面的,建议大家跟着视频做一遍。可以关注公众号回复【项目】领取项目,如果有用就点赞支持一下吧。

文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【项目】获取我为大家准备的项目

发表评论

表情:
评论列表 (有 0 条评论,215人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java全局异常处理-定义异常处理

    > 哈喽!大家好,我是旷世奇才李先生 > 文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】更有我为大家准备的福利哟,回复【项目】获取我为大家准备的项