概要

你是不是在为业务逻辑中出现的异常弄的焦头烂额,常常在后台报错,前端却无法提示错误内容,导致用户体验极差?比如下单失败,前端只能提示下单失败,但是却不知道为什么失败,是库存不足,还是余额不足,亦或是商品已经失效?

之前想在 service 层直接返回封装好的 Reponse(code, data,msg) 对象,这样的话我就直接在service层提示出错原因了(msg:错误提示),但是这样代码就不够美观,因为Response原本是设计为后端统一返回的对象,太臃肿,最后决定用自定义异常来完成。

定义常见的错误枚举类


import lombok.AllArgsConstructor;
import lombok.Getter; /**
* @author: zp
* @Date: 2019-10-10 14:47
* @Description:
*/
@Getter
@AllArgsConstructor
public enum ErrorType {
/**
* 错误类型
*/
OBJECT_NOT_FOUND(0,"对象不存在"), INVALID_PARAMS(1,"参数不正确"), result_not_exist(2,"记录不存在") ; /**
* 错误码
*/
private int code; /**
* 提示信息
*/
private String msg;
}

自定义异常

提供了两个构造方法,一个用来提示常见的错误(枚举类中的),另一个提示不常用的(一次两次的那种),可拓展。

import com.example.demojpa.enums.ErrorType;
import lombok.Getter; /**
* @author: zp
* @Date: 2019-10-10 14:42
* @Description:
*/
@Getter
public class ServiceException extends RuntimeException{
private Integer code; /**
* 使用已有的错误类型
* @param type 枚举类中的错误类型
*/
public ServiceException(ErrorType type){
super(type.getMsg());
this.code = type.getCode();
} /**
* 自定义错误类型
* @param code 自定义的错误码
* @param msg 自定义的错误提示
*/
public ServiceException(Integer code, String msg){
super(msg);
this.code = code;
}
}

定义响应对象及工具类(这个不是必需的)

  • 响应对象

    /**
    * @author: zp
    * @Date: 2019-10-10 15:22
    * @Description:
    */
    @Data
    public class Response<T> { /**
    * 状态码
    */
    private Integer code; /**
    * 请求成功时返回的对象
    */
    private T data; /**
    * 提示信息
    */
    private String msg; }
  • 工具类

    import com.example.demojpa.model.Response;
    
    /**
    * @author: zp
    * @Date: 2019-10-10 15:48
    * @Description:
    */
    public class ResponseUtils {
    /**
    * 调用成功
    */
    private static final String SUCCESS = "调用成功!"; public static Response success(Object obj){
    Response res = new Response();
    res.setCode(200);
    res.setData(obj);
    res.setMsg(SUCCESS);
    return res;
    } public static Response success(){
    return success(null);
    } public static Response error(Integer code, String msg){
    Response res = new Response();
    res.setCode(code);
    res.setMsg(msg);
    return res;
    } }

异常处理类

import com.example.demojpa.exception.ServiceException;
import com.example.demojpa.model.Response;
import com.example.demojpa.utils.ResponseUtils;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody; /**
* @author: zp
* @Date: 2019-10-10 15:11
* @Description:
*/ @ControllerAdvice
public class ServiceExceptionHandler { /**
* @ExceptionHandler相当于controller的@RequestMapping
* 如果抛出的的是ServiceException,则调用该方法
* @param se 业务异常
* @return
*/
@ExceptionHandler(ServiceException.class)
@ResponseBody
public Response handle(ServiceException se){
return ResponseUtils.error(se.getCode(),se.getMessage());
}
}

测试

为了简单一点,我直接在controller中抛异常,看看结果。

@GetMapping("/exception/{msg}")
public String exception(@PathVariable String msg) throws InvalidParamExceptionAbstract, NoSuchObjectExceptionAbstract {
if(StringUtils.isEmpty(msg)){
throw new ServiceException(ErrorType.INVALID_PARAMS);
}else if("null".equals(msg)) {
throw new ServiceException(ErrorType.OBJECT_NOT_FOUND);
}else{
throw new ServiceException(250,"瞧你那傻样!");
}
}

关注我不会让你失望哟~

SpringBoot自定义异常,优雅解决业务逻辑中的错误的更多相关文章

  1. 从App业务逻辑中提炼API接口

    2.1 从App业务逻辑中提炼API接口 业务逻辑思维导图 功能-业务逻辑思维导图 基本功能模块关系 功能模块接口UML(设计出API) 在设计稿标注API 编写API文档 2.2 设计API的要点 ...

  2. PHP性能优化四(业务逻辑中使用场景)

    php脚本性能,很多时候依赖于你的php版本.你的web server环境和你的代码的复杂度. Hoare曾经说过“过早优化是一切不幸的根源”.当你想要让你的网站更快运转的时候,你才应该去做优化的事情 ...

  3. java中异常处理机制 throw抛出自定义业务逻辑异常 throws继续抛出 catch捕获后会自动继续抛向调用方法

    package com.swift; public class Exception_TestC { public static void main(String[] args) { /* * 第5题: ...

  4. 在 Laravel 5 中使用 Repository 模式实现业务逻辑和数据访问的分离

    1.概述 首先需要声明的是设计模式和使用的框架以及语言是无关的,关键是要理解设计模式背后的原则,这样才能不管你用的是什么技术,都能够在实践中实现相应的设计模式. 按照最初提出者的介绍,Reposito ...

  5. SpringBoot+ShardingSphere彻底解决生产环境数据库字段加解密问题

    前言   互联网行业公司,对于数据库的敏感字段是一定要进行加密的,方案有很多,最直接的比如写个加解密的工具类,然后在每个业务逻辑中手动处理,在稍微有点规模的项目中这种方式显然是不现实的,不仅工作量大而 ...

  6. DDD实战进阶第一波(八):开发一般业务的大健康行业直销系统(业务逻辑条件判断最佳实践)

    这篇文章其实是大健康行业直销系统的番外篇,主要给大家讲讲如何在领域逻辑中,有效的处理业务逻辑条件判断的最佳实践问题. 大家都知道,聚合根.实体和值对象这些领域对象都自身处理自己的业务逻辑.在业务处理过 ...

  7. MySQL Execution Plan--合理利用隐式的业务逻辑

    问题描述 优化过程中遇到一个SQL: SELECT SUM(user_value) FROM user_log ; 其执行计划为: . row *************************** ...

  8. JeeSite 4.0 简化业务逻辑层开发

    2019独角兽企业重金招聘Python工程师标准>>> 引言 对于业务逻辑层的开发重复代码很多,尽管有代码生成器,但从代码量总的来说还是比较多,所以就有了以下抽象类及工具,对一些常用 ...

  9. RxJava系列番外篇:一个RxJava解决复杂业务逻辑的案例

    之前写过一系列RxJava的文章,也承诺过会尽快有RxJava2的介绍.无奈实际项目中还未真正的使用RxJava2,不敢妄动笔墨.所以这次还是给大家分享一个使用RxJava1解决问题的案例,希望对大家 ...

随机推荐

  1. P2486 [SDOI2011]染色 维护区间块数 树链剖分

    https://www.luogu.org/problemnew/show/P2486   题意 对一个树上维护两种操作,一种是把x到y间的点都染成c色,另一种是求x到y间的点有多少个颜色块,比如11 ...

  2. SPOJ - Find The Determinant III 计算矩阵的行列式答案 + 辗转相除法思想

    SPOJ -Find The Determinant III 参考:https://blog.csdn.net/zhoufenqin/article/details/7779707 参考中还有几个关于 ...

  3. codeforces 755D. PolandBall and Polygon(线段树+思维)

    题目链接:http://codeforces.com/contest/755/problem/D 题意:一个n边形,从1号点开始,每次走到x+k的位置如果x+k>n则到x+k-n的位置,问每次留 ...

  4. poj 3660Cow Contest

    题目链接:http://poj.org/problem?id=3660 有n头奶牛还有m种关系a,b表示a牛逼b彩笔,所以a排名比b高 最后问你给出的关系最多能确定多少头奶牛的排名,而且给出的数据不会 ...

  5. 深度递归必须知道的尾调用(Lambda)

    引导语 本文从一个递归栈溢出说起,像大家介绍一下如何使用尾调用解决这个问题,以及尾调用的原理,最后还提供一个解决方案的工具类,大家可以在工作中放心用起来. 递归-发现栈溢出 现在我们有个需求,需要计算 ...

  6. VS Code 前端开发常用快捷键插件

    一.vs code 的常用快捷键 1.注释:a) 单行注释:[ctrl+k,ctrl+c] 或 ctrl+/ b) 取消单行注释:[ctrl+k,ctrl+u] (按下ctrl不放,再按k + u) ...

  7. SVN更新失败

    一.svn更新失败 使用svn遇到的问题是,更新失败,代码被锁定. 解决办法: 在项目上右键,如图所示: 图一: ​ 图二: ​ 之后再更新,基本上都没有问题了.如果还有问题,看下面. 二.工具清理 ...

  8. 【Linux】一些常用命令(待整理)

    一.关机重启命令 二.查询ip 三.查询杀死进程 四.CentOS7 关闭防火墙 五.vim常用 5.1 搜索 5.2 设置行号 剪切 替换 一.关机重启命令 shutdown -h 10 #计算机将 ...

  9. 【LeetCode】240-搜索二维矩阵 II

    题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有矩阵 m ...

  10. Empire – PowerShell 后渗透攻击框架

    0x01 简介 Empire是一个后开发框架.它是一个纯粹的PowerShell代理,具有加密安全通信和灵活架构的附加功能.Empire具有在不需要PowerShell.exe的情况下执行PowerS ...