《阿里巴巴java规范》 Result 方式杂谈
前言 上个月开始和同事一起做一个为期一个月的项目。期间同事看了我的代码,给我投来了一个奇异的眼神,问道“你的代码没有错误码吗?我调你的方法,我怎么知道成功与否呢?”,今天我就这个话题来讨论一下为什么系统内部调用时不需要封装请求结果,出错直接抛出异常就好。 核心争论点 系统的内部调用是否需要封装错误码以及请求返回结果。换句话说,我同事认为一个成功的系统调用需要像下面这样返回数据对象(这里只是以json作为示例,并不代表我们调用的结果是json)。 json content_copy 复制代码 { "code": 200, "success": true, "msg": "", "data": {} } 而一个失败的系统调用是否又需要像下面这样返回。 json content_copy 复制代码 { "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》,我对里面提到的一个观点很有感触,或许是受这个观点潜移默化的影响,我觉得有必要坚持我的观点。