springboot异常处理的基本规范

 更新时间:2020年11月10日 10:25:27   作者:Jame  
这篇文章主要给大家介绍了关于springboot异常处理的基本规范,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

背景分析

在项目的开发中,不管是对底层的数据逻辑操作过程,还是业务逻辑的处理过程,还是控制逻辑的处理过程,都不可避免会遇到各种可预知的、不可预知的异常。处理好异常对系统有很好的保护作用,同时会大大提高用户的体验。

异常处理分析

概述

Java项目中处理异常方式无非两种,要么执行trycatch操作,要么执行throw操作(抛给其它对象处理),无论采用哪种方式,其目的是让我们的系统对异常要有反馈。但现在的问题是我们如何让这种反馈代码的编写即简单又直观、友好。

处理规范

我们在处理异常的过程中通常要遵循一定的设计规范,例如:

  • 捕获异常时与抛出的异常必须完全匹配,或者捕获异常是抛出异常的父类类型。
  • 避免直接抛出RuntimeException,更不允许抛出Exception或者Throwable,应使用有业务含义的自定义异常(例如ServiceException)。
  • 捕获异常后必须进行处理(例如记录日志)。如果不想处理它,需要将异常抛给它的调用者。
  • 最外层的逻辑必须处理异常,将其转化成用户可以理解的内容。
  • 避免出现重复的代码(Don't Repeat Yourself),即DAY原则。

SpringBoot 工程下的异常处理

准备工作

第一步:创建项目或module,并添加web依赖,代码如下:

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
</dependency>

第二步:修改项目访问端口为80,例如

server.port=80

第三步:定义Controller类,代码如下:

package com.cy.pj.arithmetic.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class ArithmeticController {

 @RequestMapping("doCompute/{n1}/{n2}")
 @ResponseBody
 public String doCompute(@PathVariable Integer n1, 
 @PathVariable Integer n2){
  Integer result=n1/n2;
  return "Result is "+result;
 }
}

第四步启动项目进行访问测试

在浏览器地址栏输入http://localhost/doCompute/10/2,检测输出结果。

Result is 5

默认异常处理

在浏览器地址栏输入http://localhost/doCompute/10/0,检测输出结果。

对于这样的默认异常处理(spring boot提供),用户体验不太友好,为了呈现更加友好的异常信息,我们通常要对异常进行自定义处理。

自己try异常处理

在控制层方法中,我们可以进行try catch处理,例如:

 @RequestMapping("doCompute/{n1}/{n2}")
 @ResponseBody
 public String doCompute(@PathVariable Integer n1, 
 @PathVariable Integer n2){
   try{
   Integer result=n1/n2;
   return "Result is "+result;
   }catch(ArithmeticException e){
   return "exception is "+e.getMessage();
   }
 } 

一个Controller类中通常会有多个方法,这样多个方法中都写try语句进行异常处理会带来大量重复代码的编写,不易维护。

Controller内部定义异常处理方法

在Controller类中添加异常处理方法,代码如下:

@ExceptionHandler(ArithmeticException.class)
@ResponseBody
public String doHandleArithmeticException(ArithmeticException e){
 e.printStackTrace();
 return "计算过程中出现了异常,异常信息为"+e.getMessage();
}

@ExceptionHandler注解描述的方法为异常处理方法(注解中的异常类型为可处理的异常类型),假如Controller类中的逻辑方法中出现异常后没有处理异常,则会查找Controller类中有没有定义异常处理方法,假如定义了,且可以处理抛出的异常类型,则由异常处理方法处理异常。

控制层中的全局异常处理类及方法定义

当项目由多个控制层类中有多个共性异常的处理方法定义时,我们可以将这些方法提取到公共的父类对象中,但是这种方式是一种强耦合的实现,不利于代码的维护。我们还可以借助spring框架中web模块定义的全局异常处理规范进行实现,例如定义全局异常处理类,代码如下:

package com.cy.pj.common.web;

@RestControllerAdvice
public class GlobalExceptionHandler {

 @ExceptionHandler(ArithmeticException.class)
 public String doHandleArithmeticException(ArithmeticException e){
  e.printStackTrace();
  return "计算过程中出现了异常,异常信息为"+e.getMessage();
 }
} 

其中,@RestControllerAdvice 注解描述的类为全局异常处理类,当控制层方法中的异常没有自己捕获,也没有定义其内部的异常处理方法,底层默认会查找全局异常处理类,调用对应的异常处理方法进行异常处理。

总结

到此这篇关于springboot异常处理基本规范的文章就介绍到这了,更多相关springboot异常处理规范内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现简单的日历界面

    Java实现简单的日历界面

    这篇文章主要为大家详细介绍了Java实现简单的日历界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • java中匿名内部类解读分析

    java中匿名内部类解读分析

    本篇文章介绍了,java中匿名内部类解读分析。需要的朋友参考下
    2013-05-05
  • java对接微信小程序详细流程(登录&获取用户信息)

    java对接微信小程序详细流程(登录&获取用户信息)

    这篇文章主要给大家介绍了关于java对接微信小程序(登录&获取用户信息)的相关资料,我们在开发微信小程序时经常需要获取用户微信用户名以及头像信息,微信提供了专门的接口API用于返回这些信息,需要的朋友可以参考下
    2023-08-08
  • 深入了解Java File对象的使用

    深入了解Java File对象的使用

    这篇文章主要为大家详细介绍了Java中File对象的使用的相关资料,文中的示例代码讲解详细,对我们学习Java有一定的帮助,需要的可以参考一下
    2022-11-11
  • 手把手教你使用IDEA创建多模块(maven)项目

    手把手教你使用IDEA创建多模块(maven)项目

    这篇文章主要给大家介绍了关于如何使用IDEA创建多模块(maven)项目的相关资料,文中通过图文以及实例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • 详解java 对象锁与类锁

    详解java 对象锁与类锁

    这篇文章主要介绍了java 对象锁与类锁的相关资料,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-09-09
  • MyBatis动态SQL foreach标签实现批量插入的方法示例

    MyBatis动态SQL foreach标签实现批量插入的方法示例

    这篇文章主要介绍了MyBatis动态SQL foreach标签实现批量插入的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • 不使用他人jar包情况下优雅的进行dubbo调用详解

    不使用他人jar包情况下优雅的进行dubbo调用详解

    这篇文章主要为大家介绍了不使用他人jar包情况下优雅的进行dubbo调用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Java 中的 print() 和 println()

    Java 中的 print() 和 println()

    这篇文章主要介绍了Java 中的 print() 和 println(),Java 中的 print()和println()方法用于在控制台上显示文本,下面来看看它们之间到底有什么区别吧,需要的朋友也可以参考一下
    2021-11-11
  • Java使用POI导出大数据量Excel的方法

    Java使用POI导出大数据量Excel的方法

    今天需要写一个导出的Excel的功能,但是发现当数据量到3万条时,列数在23列时,内存溢出,CPU使用100%,测试环境直接炸掉。小编给大家分享基于java使用POI导出大数据量Excel的方法,感兴趣的朋友一起看看吧
    2019-11-11

最新评论