springboot之全局异常处理和统一响应对象

举报
whisperrr 发表于 2021/08/13 14:36:12 2021/08/13
【摘要】 springboot异常处理

  一、springboot异常处理

  1.SpringBoot 默认的异常处理机制

  默认情况,SpringBoot 提供两种不同响应方式

  一种是浏览器客户端请求一个不存在的页面或服务端异常时,SpringBoot默认会响应一个 html

  另一种是使用 postman等调试工具请求不存在的url或服务端异常时,默认返回json信息

  2.SpringBoot 全局异常处理

  一般我们不会将错误信息返回前端,自己去 try catch捕获异常,但有个问题:每个方法都这样捕获异常,肯定是不合适,这是我们就需要全局的异常处理了。

  @RestController

  public class ExceptionController {

  @GetMapping("exceptionA")

  public void methodA() {

  try {

  int a = 100 / 0;

  } catch (Exception e) {

  e.printStackTrace();

  }

  }

  }

  2.1 局部异常处理

  使用 @EceptionHandle注解实现某个类的局部异常处理

  @RestController

  public class ExceptionController {

  @GetMapping("exceptionA")

  public void methodA() {

  int a = 100 / 0;

  }

  /**

  * 局部异常处理

  */

  @ExceptionHandler(Exception.class)

  public String exHandler(Exception e) {

  // 判断发生异常的类型是除0异常则做出响应

  if (e instanceof ArithmeticException) {

  return "发生了除0异常";

  }

  // 未知的异常做出响应

  return "发生了未知异常";

  }

  }

  2.2 全局异常处理

  使用 @ControllerAdvice + @ExceptionHandler注解实现全局异常处理

  自定义一个异常类

  @RestControllerAdvice

  public class DefaultException {

  @ExceptionHandler({NullPointerException.class})

  public String exception(NullPointerException exception) {

  return "空指针异常";

  }

  @ExceptionHandler({IndexOutOfBoundsException.class})

  public String exception(IndexOutOfBoundsException exception) {

  return "数组越界异常";

  }

  }

  增加一个异常方法测试,由于局部异常优先级更高先注释掉了

  @RestController

  public class ExceptionController {

  @GetMapping("exceptionA")

  public void methodA() {

  int a = 100 / 0;

  }

  @GetMapping("exceptionB")

  public void methodB() {

  List list = new ArrayList<>();

  System.out.println(list.get(0));

  }

  /**

  * 局部异常处理

  */

  //@ExceptionHandler(Exception.class)

  //public String exHandler(Exception e) {

  // // 判断发生异常的类型是除0异常则做出响应

  // if (e instanceof ArithmeticException) {

  // return "发生了除0异常";大连无痛人流医院 http://www.bhbyby.net/

  // }

  // // 未知的异常做出响应

  // return "发生了未知异常";

  //}

  }

  全局异常注解已生效

  3. 自定义异常

  自定义异常只需要继承 exception类或其子类

  @Data

  @NoArgsConstructor

  public class CustomException extends Exception {

  private static final long serialVersionUID = 1L;

  private Integer code;

  private String mes;

  /**

  * @param code 状态码

  * @param msg 异常返回信息

  * @description 构造器

  */

  public CustomException(Integer code, String msg) {

  super(msg);

  this.code = code;

  }

  }

  使用时可以直接抛出异常对象

  @GetMapping("exceptionC")

  public void methodC() throws CustomException {

  int a = 1;

  if (a == 1) {

  throw new CustomException(10086, "自定义异常");

  }

  }

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。