前言

上个月开始和同事一起做一个为期一个月的项目。期间同事看了我的代码,给我投来了一个奇异的眼神,问道“你的代码没有错误码吗?我调你的方法,我怎么知道成功与否呢?”,今天我就这个话题来讨论一下为什么系统内部调用时不需要封装请求结果,出错直接抛出异常就好

核心争论点

系统的内部调用是否需要封装错误码以及请求返回结果。换句话说,我同事认为一个成功的系统调用需要像下面这样返回数据对象(这里只是以json作为示例,并不代表我们调用的结果是json)。

{"code": 200,"success": true,"msg": "","data": {}
}

而一个失败的系统调用是否又需要像下面这样返回。

{"code": 500,"success": false,"msg": "error message","data": {}
}

使用结果类

这里我觉得可能她是受《阿里巴巴开发手册》里面的一条关于 RPC 调用规范的影响

跨应用间 RPC 调用优先考虑使用 Result 方式,封装 isSuccess()方法、“错误码”、“错误 简短信息”;而应用内部推荐异常抛出。

说明:关于 RPC 方法返回方式使用 Result 方式的理由:
1)使用抛异常返回方式,调用方如果没有捕获到就会产生运行时错误。
2)如果不加栈信息,只是 new 自定义异常,加入自己的理解的 error message,对于调用端解决问题
的帮助不会太多。如果加了栈信息,在频繁调用出错的情况下,数据序列化和传输的性能损耗也是问题。

系统内部调用要使用异常

文中也提到,系统内部调用还是应该通过抛出 异常 的方式,而不是用 Result 方式来返回错误结果。 (这里的 Result 方式就是上文我们提到的,使用结果类来封装请求结果)
在系统内部使用 异常,相对于使用 Result 方式来说有个非常明显的优点–在使用异常时,不需要对调用成功与否进行判断。
如果调用失败直接抛出异常,调用者处理这个异常就好

看到这里大家可能有疑惑,这么简单的问题为什么还需要和同事讨论?

我认为有这个讨论的根源问题在于每个人开发习惯的不同。方法调用时同事更喜欢使用 Result 方式来处理,而我更喜欢使用 异常 的方式。
其实,我这个时候做个让步也没什么,毕竟只有提供给她的部分函数需要按照这个方式,改动量不大。但是最近我在读
Sonmez 的《Soft Skills》,我对里面提到的一个观点很有感触,或许是受这个观点潜移默化的影响,我觉得有必要坚持我的观点。

作为一名软件开发人员,你经常面临许多困难和挑战,技术和道德两个方面都有。如果你想成为专业人士,你必须要在两种情况下都做出正确的选择

结束语

这里不得不提到逍遥子和马老师老是挂在嘴边的一句话,“要坚持难却正确的事”。不过,在文章最后有个忠告,在和同事争论的时候要充分说明你的理由,
切忌说 “这是 XXX(某个有名的人或者权威)说的”、“这是 《xxx》 书上讲的”、“大家都是这样做的”等,这些话隐藏着 “你只是一个盲目跟随的人,并不理解为什么要这么做”
会让同事认为你的思考不够, 更加难说服对方。

扩展

在《阿里巴巴java开发规范》关于 RPC 调用的描述中,对使用 Result 方式的解释主要是围绕 Client 端的理解成本性能

这里我进行补充下。目前很多公司的服务端开发语言越来越丰富,目的都是期望发挥不同编程语言的优势。
当不同编程语言之间通过 服务治理框架 互联和互通时,不同编程语言之间的差异,可能会对调用结果的产生一些不可控的影响
比如:异常 这个东西并不是所有语言中都有,当服务端返回异常,当 Client 端的编程语言中没有 异常 的情况下,
服务治理框架会对响应结果中的 异常 进行转换,转换结果并不可控,会对服务调用方造成非常大的困扰(问题排查、异常情况处理)。
所以,为了保证应用在多编程语言环境下的 鲁棒性,对 RPC 调用结果使用 Result 方式很有必要。

《阿里巴巴java规范》 Result 方式杂谈相关推荐

  1. idea安装阿里巴巴java规范插件(代码质量管理)安装和使用

    一.插件发布背景 2017年10月14日上午9:00  阿里巴巴于在杭州云栖大会<研发效能峰会>上,正式发布<阿里巴巴Java开发手册>扫描插件,该插件在扫描代码后,将不符合& ...

  2. idea安装阿里巴巴java规范插件的两种方式

    1.插件发布背景 2017年10月14日上午9:00  阿里巴巴于在杭州云栖大会<研发效能峰会>上,正式发布<阿里巴巴Java开发手册>扫描插件,该插件在扫描代码后,将不符合& ...

  3. 为什么我不建议你用阿里巴巴Java规范,而使用 Google Guava 编程?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来自 | 张丰哲 链接 | www.jianshu.com ...

  4. 我司为什么禁止使用阿里巴巴Java规范?

    点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 每天 14:00 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java ...

  5. 为什么我不建议你用阿里巴巴Java规范?而是使用 Google Guava 编程?

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 Themorewefind,themorewelose.Themorewek ...

  6. 阿里巴巴java规范检查_阿里巴巴Java开发规范

    >[info] 1.[强制]POJO 类中布尔类型的变量,都不要加 is. 否则部分框架解析会引起序列化错误. 反例:定义为基本数据类型 `boolean isSuccess`:的属性,它的方法 ...

  7. 阿里巴巴编码规范 java认证记录

    记录一下个人的考试题目,答案没有全对,提供题目给大家参考交流,如有发现错误,留言我改正即可,谢谢! 我始终相信互相学习才是进步的捷径! 阿里巴巴开发规范1.4版点击下载 单选1.KV结构的集合,在处理 ...

  8. 【考试记录】Apsara Clouder基础技能认证:阿里巴巴编码规范(Java)

    一:考试总结 我是考了一次就过了,看了一晚上和一上午,开发手册看了一遍,考题分析看了两遍,次要资料里的东西看了一遍.(文章最后有资料) 先看主要资料里的Java开发手册,这个是官方文档,考题都是从里面 ...

  9. JAVA 开发命名规范——阿里巴巴Java开发手册

    0)Service/DAO层方法命名规约 1)获取单个对象的方法用get做前缀. 2)获取多个对象的方法用list做前缀. 3)获取统计值的方法用count做前缀. 4)插入的方法用save(推荐)或 ...

最新文章

  1. 随机变量的数字特征(数学期望,方差,协方差与相关系数)
  2. 打造一个名博需要多久
  3. 轻松理解正向代理与反向代理
  4. python下载百度网盘文件-python通过百度云api的方式上传或下载文件
  5. Redis分布式锁(Redlock官方文档的理解)
  6. 函数集成redis与Spring集成
  7. 概率论-3.2 边际分布与随机变量的独立性
  8. Android 极光推送设置别名
  9. “Table .__efmigrationshistory doesn’t exist”的解决方案
  10. 残疾人软件开发_组织如何使残疾人更具包容性
  11. [TimLinux] scrapy 在Windows平台的安装
  12. Win10窗口背景色改成淡绿色的方法
  13. 华三路由器虚拟服务器设置,H3C vLNS系列虚拟L2TP网络服务器 配置指导-E0324-5W100...
  14. Ceres-Solver安装与简介
  15. CM4下SPI接口CAN模块配置流程
  16. 嵌入式面试(笔试)笔记1
  17. 《数据可视化技术》 太平洋汽车销售分析
  18. 离散数学序关系求解最大/小元,极大/小元,上/下届,上/下确界
  19. Nginx HTTP 健康检查
  20. vue生命周期的详解

热门文章

  1. win7驱动程序未经签名可以使用吗_windows-7 – Windows7引导选项,允许忽略未签名的驱动程序...
  2. Stream流练习题大全以及答案
  3. Eth-Trunk的配置
  4. 2018-2019-2学号20189220余超《移动平台应用程序开发实践》课程总结
  5. Mocha Pro 2022(合集)
  6. Web课程设计——小米商城页面实战(html,css,js实现)
  7. C语言问题:0xC0000005: 写入位置 0xFFFFFFCC 时发生访问冲突。
  8. 关于mysql的timestamp时间范围
  9. Vue.js中的v-model指令(双向绑定)
  10. C++反汇编代码分析--函数调用