Springboot之自定义全局异常处理的实现

作者:韩数 时间:2022-11-12 04:49:23 

前言:

在实际的应用开发中,很多时候往往因为一些不可控的因素导致程序出现一些错误,这个时候就要及时把异常信息反馈给客户端,便于客户端能够及时地进行处理,而针对代码导致的异常,我们一般有两种处理方式,一种是throws直接抛出,一种是使用try..catch捕获,一般的话,如果逻辑的异常,需要知道异常信息,我们往往选择将异常抛出,如果只是要保证程序在出错的情况下 依然可以继续运行,则使用try..catch来捕获。

但是try..catch会导致代码量的增加,让后期我们的代码变得臃肿且难以维护。当然,springboot作为一个如此优秀的框架,肯定不会坐视不管的,通过springboot自带的注解,我们可以方便的自定义我们的全局异常处理器,并且以json格式返回给我们的客户端。

代码实战:

捕获全局异常:

首先呢,我们新建我们负责全局异常捕捉处理的类:MyControllerAdvice,代码如下:


@ControllerAdvice
public class MyControllerAdvice {

@ResponseBody
 @ExceptionHandler(value = Exception.class)
 public Map<String,Object> exceptionHandler(Exception ex){
   Map<String,Object> map = new HashMap<String,Object>();
   map.put("code",100);
   map.put("msg",ex.getMessage());
   //这里可以加上我们其他的异常处理代码,比如日志记录,,,
   return map;
 }

}

注解说明:
@ControllerAdvice 通过AOP的方式配合@ExceptionHandler()注解捕获在Controller层面发生的异常。如果需要扫描自定路径下的Controller,添加basePackages属性


@ControllerAdvice(basePackages ="com.example.demo.controller")

@RestControllerAdvice : 和@ControllerAdvice作用相同,可以理解为  @ResponseBody+@ControllerAdvice 的组合使用。

@ExceptionHandler():该注解作用主要在于声明一个或多个类型的异常,当符合条件的Controller抛出这些异常之后将会对这些异常进行捕获,然后按照其标注的方法的逻辑进行处理,从而改变返回的视图信息。

测试:


@RestController
public class UserController {

@GetMapping("/test")
 public String test(){
   int num = 1/0;
   return "Hello World";
 }
}

结果:

{"msg":"/ by zero","code":100}

捕获自定义异常:

自定义我们的异常信息类MyException 并继承RuntimeException:


public class MyException extends RuntimeException {

private String errorCode;
 private String errorMsg;

public MyException(String errorCode, String errorMsg) {
   this.errorCode = errorCode;
   this.errorMsg = errorMsg;
 }

public String getErrorCode() {
   return errorCode;
 }

public void setErrorCode(String errorCode) {
   this.errorCode = errorCode;
 }

public String getErrorMsg() {
   return errorMsg;
 }

public void setErrorMsg(String errorMsg) {
   this.errorMsg = errorMsg;
 }

}

修改我们的MyControllerAdvice,将MyException添加进去:


 @ResponseBody
 @ExceptionHandler(value = MyException.class)
 public Map<String,Object> myExceptionHandler(MyException mex){
   Map<String,Object> map = new HashMap<String,Object>();
   map.put("code",mex.getErrorCode());
   map.put("msg",mex.getErrorMsg());
   //其他业务代码...
   return map;
 }

测试:


 @GetMapping("/test1")
 public String test1(){
   String name = null;
   if(name == null){
     throw new MyException("101","用户名为空");
   }
   return "Hello World";
 }

输出:

{"msg":"用户名为空","code":"101"}

来源:https://juejin.im/post/5d64c309f265da03b76b2fc5

标签:Springboot,全局异常
0
投稿

猜你喜欢

  • Android DataBinding类关系深入探究

    2022-08-17 19:23:51
  • Java魔法堂之调用外部程序的方法

    2023-11-09 07:14:16
  • Java程序员面试中的多线程问题总结

    2021-12-12 07:48:33
  • C#使用远程服务调用框架Apache Thrift

    2023-05-07 01:05:01
  • C sharp (#) 数据类型获取方式

    2022-03-29 00:33:10
  • 基于C#实现Windows服务状态启动和停止服务的方法

    2022-07-27 12:17:57
  • 使用Jetpack Compose实现翻转卡片效果流程详解

    2022-01-24 16:26:55
  • Java中ArrayList和SubList的坑面试题

    2023-09-21 06:56:21
  • Android仿微信清理内存图表动画(解决surfaceView屏幕闪烁问题)demo实例详解

    2023-05-31 15:35:27
  • 基于WPF实现3D画廊动画效果的示例代码

    2022-02-06 08:02:22
  • mybatis中映射文件(mapper)中的使用规则

    2021-06-28 20:09:08
  • android PopupWindow 和 Activity弹出窗口实现方式

    2021-07-14 16:27:36
  • Android studio 3.0上进行多渠道打包遇到的问题小结(超简洁版)

    2022-09-16 07:58:40
  • Android 捕获错误日志的方法

    2021-06-16 16:24:44
  • Android复选框CheckBox与开关按钮Switch及单选按钮RadioButton使用示例详解

    2023-02-06 18:20:42
  • idea 多模块项目依赖父工程class找不到问题的方法

    2022-06-08 10:47:41
  • Android使用ViewDragHelper实现图片下拽返回示例

    2023-08-08 00:14:12
  • WPF实现窗体亚克力效果的示例代码

    2022-07-25 10:38:08
  • 微信公众号开发之设置自定义菜单实例代码【java版】

    2022-09-02 00:52:22
  • 关于maven:pom文件的使用解析

    2022-02-08 06:21:41
  • asp之家 软件编程 m.aspxhome.com