`
tanjiayqq
  • 浏览: 19889 次
文章分类
社区版块
存档分类
最新评论

设计接口时应该如何设计业务异常?

阅读更多
本文为原创,转载请注明

作者:cha1R(tanjiayqq)

Java里异常分两种,一种是检查(checked)的,一种是非检查(unchecked)的。

非检查以RuntimeException作为典型代表,它有一个特点就是我们可以不用捕捉它,如果没有捕捉它,它会一直往上抛直到main()方法处理,从而退出整个程序。注意如果是多线程的话,它并不会在main()方法终止程序,它会一直往上抛直到run()方法,而run()方法没有捕捉它的话会终止线程。

作为业务异常,是要反馈给用户的,所以我们不希望发生任何终止线程或者终止程序的代码。所以定义业务异常,我们一般使用检查的(checked)异常,定义一个异常非常简单,只需要写一个简单的类继承Exception即可。


public class InvalidAccount extends Exception{
    private static final long serialVersionUID = 1L;
    public InvalidAccount(){
        super("无效的账户");
    }
    public InvalidAccount(String msg){
        super(msg);
    }
}


那么我们一般什么时候需要设计业务异常呢?从我的经验来看,一般是设计业务接口的时候需要考虑这个接口会引发的业务异常。

假设设计一个登陆业务接口:

   
    /**
     * 登录
     * @param username 用户名
     * @param password 密码
     * @return 是否登录成功*/
    boolean login(String username,String password);

显然这个接口没有抛出异常,那么我们在还没实现接口的情况下,该如何考虑这个接口会发生什么样的异常?

其实我们很难全面地预测到它会发生一些什么,但是我们只需要考虑业务异常,业务异常是什么?即应用异常(如 权限不够等),这类异常需要通过前台反馈给用户,友好提示用户当前操作异常。

最大的特点就是,这个异常一定是由于当前接口调用不当(即用户操作不当,因为它接收的是用户输入的数据)造成的,那么最直接的思路就是从传入参数入手:

从登陆接口来看,传入的是用户名和密码,那么我们可以抛出一个“无效的用户”或者抛出“无效的用户名”和“无效的密码” 异常,其他的都不用抛出,因为它并不是由调用者引发的,在方法内部处理完就行。



再来看看一个我们一个项目的业务接口,评论微博:

    /**
     * 评论
     * @param userId     被评论的用户的ID
     * @param weiboId     被评论的微博的ID
     * @param content     评论内容
     * @return
     */
    boolean comment(String userId,String weiboId,String content);


定义这个方法的异常还算比较简单,从参数入手

userId:用户不存在异常

weiboId:微博不存在异常

content:内容包含敏感词汇异常,内容超出字数限制异常。 或直接用一个 内容不合法异常

这些都是可以抛出的异常。

但是有时候一条微博可能被设置为 “不可评论”,那么我们是不是要再跑出一个“不可评论异常”?这个完全不必抛出,因为我们抛出业务异常是用来反馈给用户看,从而让用户做出相应处理,但是这种不可改变的情况完全没必要交给用户决定如何处理,只需要在方法内部抛出RuntimeException,UI层统一捕获,提示一下即可。

最后介绍一个学习网站,比较适合初学者,视频略多:http://gz.itcast.cn/
分享到:
评论

相关推荐

    电商系统开发设计文档.pdf

    本文档旨在记录电商系统的开发设计文档,涵盖了电商系统的需求设计、业务流程、接口设计、功能规格、数据库设计、配置变更等方面的内容。 一、需求设计 电商系统的需求设计主要涉及到以下几个方面: 1. 用户范围...

    概要设计说明书模板

    给出系统设计中的代码的设计内容,代码设计包括系统代码(硬码)、系统代码(软码)、业务代码以及标准化代码等。对于硬码的引用需要在数据库设计的PDM中注明,对于其他代码的引用需要在数据字典或数据库设计中注明...

    酒店管理系统概要设计.pdf

    酒店管理系统的接口设计,需要考虑到系统的用户接口、外部接口和内部接口等方面。 3.1 用户接口 酒店管理系统的用户接口,需要考虑到系统的用户体验和可用性,包括客房预订、客房管理、财务管理等方面的用户接口。...

    MES系统及ERP接口设计及解决及方案.docx

    MES系统及ERP接口设计及解决方案 本文档主要介绍了智慧工厂的概念、MES系统的设计和ERP接口的解决方案。智慧工厂是基于公司的TN技术平台,结合精益制造、TOC瓶颈理论、工业物联网、自动化、设备改造、移动互联网等...

    微服务架构设计方案.docx

    微服务架构的设计需要关心微服务的业务范围,而不是服务的数量和规模尽量小。数量和规模需要依照业务功能而定。微服务设计的关键问题包括: * 职责单一原则(Single Responsibility Principle):把某一个微服务的...

    2.2.2 云原生go-zero微服务框架设计思考@万俊峰.pdf

    5. 对业务开发友好,封装复杂度:go-zero的设计目标是对业务开发者友好,封装了复杂度,提供了易于使用的接口。 go-zero的架构设计: go-zero的架构设计主要包括客户端API端、Service端、缓存层、iOS、PC、web、...

    94丨项目实战二:设计实现一个通用的接口幂等框架(设计)1

    跟限流框架类似,幂等框架的功能性需求也比较简单,但要考虑处理的异常情况有很多,比如业务代码异常、业务系统宕机、幂等框架异常。正常情况下,幂等号随着请求传递到接口

    数据库备份设计文档.docx

    当备份失败系统异常时,邮件通知开发人员,及时查看原因。 流程图 数据库备份设计文档全文共14页,当前为第2页。数据库备份设计文档全文共14页,当前为第2页。实体关系图 数据库备份设计文档全文共14页,当前为第2页...

    java面试宝典

    94、元素有一个cascade属性,如果希望Hibernate级联保存集合中的对象,casecade属性应该取什么值?(单选)(D) 22 95、以下哪些属于Session的方法?(A,B,C,D,F) 22 96、Hibernate工作原理及为什么要用? 22 97、...

    QGDW 12119-2021 微服务架构设计导则

    设计要求是指微服务架构的设计必须满足的具体要求,包括服务的接口、服务之间的交互和数据的存储等。 运维要求是指微服务架构的运维要求,包括服务的监控、服务的升级和服务的故障恢复等。 在微服务架构设计中,...

    计算机软件项目设计方案(2020).docx

    1.2.2LEAF6平台总体架构 LEAF6平台核心框架定义控制层、业务层、数据访问层的命名方式和实现规则,制定了分布式缓存、并行计算、分布式消息队列、非结构化存储可扩展技术服务的接口规范,对应用集成管理、组织机构...

    详细设计说明书

    中国移动无线城市集中运营服务平台系统项目 详细设计说明书 ...明确任务和需求,使得软件开发人员知道软件开发流程,...4.1.1.4 接口设计 描述接口。 4.1.2 功能点2….. 同4.1.1章节。 4.2 模块2…… 同4.1章节。

    毕业设计-基于 Flask 框架开发的微信小程序后端项目,用于构建小程序商城后台

    AOP(面向切面编程)设计,实现 参数校验层 & 异常统一处理层 Ubuntu 16.04上 Nginx + Gunicorn + Pipenv部署 内置 用户管理:提供用户的相关配置 权限组(角色)管理:接口权限分配和菜单权限分配 菜单管理:实现后端...

    中国银行B2C商户支付网关接口规范Ver2.3.zip

    6 延冰 2009.12.29 1、增加银行主动通知接口:网关发送B2C支付结果通知 7 延冰 2010.01.28 1、在2.3.2签名与验签一节中增加商户验证银行数字签名异常后的处理 8 延冰 2010.04.15 1、在指令说明中增加:商户主动发往...

    基于SSM使用idea构建的旅游网站---毕业设计

    7)复杂的业务在于一个景点对应多个门票,想要门票显示在对应的景点下方,要先查询出来景点,再对它遍历,根据id去 寻找门票,当时没有对应所有的景点都设置门票,报了空指针异常 8)通过代码上传图片到项目需要...

    基于Java的校园智慧节水管理系统的设计与实现(论文+源码)-kaic.doc

    本着高内聚、低耦合的原则,我归纳出...系统后台以SpringBoot框架为主要内容,采用三层架构设计开发,前端的界面呈现采用 Vue技术,各功能模块都有单独的接口来实现,从而实现了业务的独立部署,并且彼此之间不受干扰。

    拟态防御Web服务器设计与实现.docx

    架构设计应遵循模块化、抽象化和扩展化的设计思想,将Web服务器划分为多个功能模块,每个模块都具有相似的接口和功能,但具体的实现可以不同。同时,架构设计中应考虑如何将形态学算法和随机化技术融入到各个模块中...

    go-gin-api 是基于 Gin 进行模块化设计的 API 框架,封装了常用的功能,使用简单,致力于进行快速的业务研发

    基于 Gin 进行模块化设计的 API 框架,封装了常用功能,使用简单,致力于进行快速的业务研发。同时增加了更多限制,约束项目组开发成员,规避混乱无序及自由随意的编码。比如,支持 cors 跨域、jwt 签名验证、zap ...

    国际医疗中心智能化系统规划设计方案(80页PPT).pptx

    每个模块负责特定的业务逻辑,模块之间通过接口进行通信和数据交换。在智能小区项目中,你可能会有门禁管理模块、监控管理模块、家居控制模块等。 五、详细设计与实现 针对每个功能模块,进行详细的设计和实现。这...

    毕业设计 - 基于SSM使用idea构建的旅游网站

    7)复杂的业务在于一个景点对应多个门票,想要门票显示在对应的景点下方,要先查询出来景点,再对它遍历,根据id去 寻找门票,当时没有对应所有的景点都设置门票,报了空指针异常; 8)通过代码上传图片到项目需要...

Global site tag (gtag.js) - Google Analytics