好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java Springboot全局异常处理

前言

对于作为菜鸟程序员的我来说,经常在controller使用try-catch 来包裹住我的service层代码,首页,他及其的不好看,其次,每个方法都有这种代码块,思考有没有办法去掉它,并且优雅的处理异常。这就是今天要说的全局异常捕获

提示:以下是本篇文章正文内容,下面案例可供参考

一、思路?

springboot提供了全局异常处理的注解,我们需要弄明白的是。扑捉什么异常,结果如果返回,如何优雅的管理返回的结果集。

二、步骤

1.自定义接口:

自定义接口主要是描述返回的code码和返回msg,自定义错误描述枚举需要实现这个接口

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

public interface ErrorType {

     /**

      * 返回code

      *

      * @return

      */

     String getCode();

     /**

      * 返回mesg

      *

      * @return

      */

     String getMesg();

}

2.自定义错误枚举

使用枚举,看起来代码很优雅,并且不用使用static final来定义类型。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

@Getter

public enum SystemErrorType implements ErrorType {

     SYSTEM_ERROR( "-1" , "系统异常" ),

     SYSTEM_BUSY( "000001" , "系统繁忙,请稍候再试" );

     /**

      * 错误类型码

      */

     private String code;

     /**

      * 错误类型描述信息

      */

     private String mesg;

     SystemErrorType(String code, String mesg) {

         this .code = code;

         this .mesg = mesg;

     }

}

3.自定义异常类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

@Getter

public class MyException extends RuntimeException{

     /**

      * 异常对应的错误类型

      */

   private final ErrorType errorType;

    /**

     * 默认是系统异常

     */

    public MyException () {

        this .errorType = SystemErrorType.SYSTEM_ERROR;

    }

    public MyException(SystemErrorType systemErrorType) {

        this .errorType = systemErrorType;

     }

4.异常捕获

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

@RestControllerAdvice

@Slf4j

public class GlobalExceptionHandlerAdvice extends DefaultGlobalExceptionHandlerAdvice {

     @ExceptionHandler (value = {MyException . class })

     public Result MyException (MyException ex) {

         log.error(ex.getMessage());

         return Result.fail(ex.getErrorType());

     }

     @ExceptionHandler (value = {NotRoleException. class })

     public Result NotRoleException(NotRoleException nle) {

         // 打印堆栈,以供调试

         //nle.printStackTrace();

         String message = "该功能仅供" +nle.getRole()+ "使用!" ;

         // 返回给前端

         return Result.fail( "090017" ,message, null );

     }

}

也不是说只能通过枚举来返回,只要你的返回工具类支持参数填写,可以做类似于第二种的返回,但是这样方法对于返回的code来太好管理

5.在代码中抛异常

比如我做判空处理时,利用枚举作为参数返回

?

1

2

3

4

5

6

7

8

@PostMapping ( "/listQuestionVO" )

public Result listQuestionBankVO( @RequestBody QuestionBankQuery query){

     if (query.getPageNum()== null || query.getPageSize()== null ){

         return Result.fail(QuestionnaireErrorType.PARAMETERISNULL_ERROR);

     }

     Result result = questionBankService.listQuestionBankVO(query);

     return result;

}

实际上,你可以在你需要处理异常的地方直接throws异常,可以直接在方法上throws抛出,等待全局异常捕获

总结

只要管理code到位,用返回类型的工具类来替换枚举更适合小白

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!

原文链接:https://blog.csdn.net/qq_48329942/article/details/121034245

查看更多关于Java Springboot全局异常处理的详细内容...

  阅读:10次