【简单易懂】java中的异常、异常处理机制及全局异常拦截器详解

白色玫瑰 程序猿

时间: 2023-05-22 阅读: 1 字数:3957

{}
在Java中,异常指的是程序执行过程中发生的不正常的情况。这些情况可能是由多方面因素引起的。举个例子,假设你在银行取钱,你输入了一个错误的密码。这种情况下,银行系统会抛出一个异常来告诉你密码错误。这样,你...

java中的异常、异常处理机制及全局异常拦截器详解

我们将从以下四个问题入手,对Java中的异常抽丝剥茧。

什么是异常? 异常的分类 异常处理机制 实际开发中的异常

1. 什么是异常?

<hr>

在Java中,异常指的是程序执行过程中发生的不正常的情况。这些情况可能是由多方面因素引起的。

举个例子,假设你在银行取钱,你输入了一个错误的密码。这种情况下,银行系统会抛出一个异常来告诉你密码错误。这样,你就可以重新输入正确的密码来完成取款操作。

当程序出现异常时,它会抛出一个异常对象并中断当前的程序流程,程序会尝试查找与异常相关的处理代码(异常处理程序)来处理该异常。

2. 异常的分类

<hr>

Java中的异常分为三种类型:

Checked Exception(编译时异常/受检异常):IOException、SQLException等 Runtime Exception(运行时异常/未受检异常):NullPointerException、ArrayIndexOutOfBoundsException等 Error(错误):OutOfMemoryError、StackOverflowError等

其中,编译时异常是指在编译时就能检测到的异常,必须显式地处理,而运行时异常和错误是指在运行时才能发现的异常,可以不处理。

3. 异常处理机制

<hr>

Java提供了一种称为“异常处理机制”的机制来处理这些异常情况。它允许程序员编写代码来捕获并处理异常,从而避免程序崩溃或产生不可预料的结果。

Java中的异常处理机制包括:

try-catch-finally块:try块中包含可能引发异常的代码,catch块中捕获异常并处理,finally块中包含最终执行的代码,无论是否有异常都会执行; throws关键字:用于声明方法可能抛出的异常类型; throw关键字:用于手动抛出一个异常对象。

例如,以下是一个简单的异常处理示例:

try {
   // 可能会抛出异常的代码
} catch (Exception e) {
   // 处理异常
} finally {
   // 无论是否出现异常,都会执行的代码
}

4. 实际开发中的异常

<hr>

在实际开发中,异常处理是一项非常重要的技能,它可以帮助开发人员更好地管理和调试程序。同时,异常处理也是编写健壮和可靠的代码的关键。 通常,实际开发会定义一个全局的异常类(GlobalException)和一个全局异常拦截器(GlobalExceptionHandler),在业务流程中可通过throw关键字通过定义一个GlobalException对象,手动抛出异常给全局异常拦截器处理。 以下是一个spring框架为例的简单示例:

GlobalException:

public class GlobalException extends RuntimeException {

   private static final long servialVersionUID = 1L;

   private final CodeMsg codeMsg;

   public GlobalException(CodeMsg codeMsg) {
      super(codeMsg.toString());
      this.codeMsg = codeMsg;
   }

   public CodeMsg getCodeMsg() {
      return codeMsg;
   }
}

GlobalExceptionHandler:

@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {

   @ExceptionHandler(value = Exception.class)//拦截所有异常
   public Result<String> exceptionHandler(HttpServletRequest request, Exception e) {
      e.printStackTrace();
      if (e instanceof GlobalException) {
         GlobalException ex = (GlobalException) e;
         return Result.error(ex.getCodeMsg());
      } else if (e instanceof BindException) {
         BindException ex = (BindException) e;
         List<ObjectError> errors = ex.getAllErrors();//绑定错误返回很多错误,是一个错误列表,只需要第一个错误
         ObjectError error = errors.get(0);
         String msg = error.getDefaultMessage();
         return Result.error(CodeMsg.BIND_ERROR.fillArgs(msg));//给状态码填充参数
      } else {
         return Result.error(CodeMsg.SERVER_ERROR);
      }

   }
}

执行流程如下:

拦截所有异常 判断是否为自定义的异常e instanceof GlobalException,如果是,返回封装的信息。 判断是否为数据绑定异常e instanceof BindException,如果是,获取所有绑定错误的信息的列表,取出第一个作为该错误信息并返回(好处:安全、优化用户体验) 如果不是以上两种,返回信息到Result返回给客户端

原文地址:https://blog.csdn.net/m0_56170277/article/details/129693582?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168475008016800180689615%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168475008016800180689615&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-25-129693582-null-null.142^v87^insert_down28,239^v2^insert_chatgpt&utm_term=java%E4%BC%98%E5%8C%96

本文章网址:https://www.sjxi.cn/detil/db512d936c7b41f080cad3113bc2f7cb

最新评论

当前未登陆哦
登陆后才可评论哦

湘ICP备2021009447号