java-抛出异常好,还是返回结果对象好?

3,114 阅读2分钟

结论

面向对象语言java,多使用异常机制。//所有非正常业务流程,就都是异常,虽然不一定真的是错误,比如登陆密码错误。

面向过程语言C,才用状态码判断。//状态码的缺点是,要搞一大堆的判断状态的代码,影响正常业务逻辑的观感。

null

如果是查询类的接口,找到数据,可以返回null。//缺点:客户端需要校验空指针,搞得代码很冗余,但是这个不可避免。 其他,最好就是抛出异常。

多使用异常机制的优点

1.不需要校验各种状态

2.而且异常信息方便排查错误
状态码字段
描述信息
异常调用栈

3.可以多自定义业务异常
然后使用异常机制,而不是使用状态码,然后各种校验。

对外接口

使用结果对象,比如微信 支付宝的支付接口,都是结果对象。

阿里规范

3.在代码中使用“抛异常”还是“返回错误码”?

对于公司外的 http/api 开放接口必须 使用“错误码”;而应用内部推荐异常抛出;跨应用间 RPC 调用优先考虑使用 Result 方式,封 装 isSuccess(通信状态)、“错误码”(业务状态)、“错误简短信息”。


总结

1.对公司外 //肯定是结果对象,不可能把异常抛给人家

2.公司内-应用内 //抛出异常

3.公司内-跨应用 //最好是状态码

developer.aliyun.com/article/720…

分层

1、dao层

dao层,不捕获异常,也不校验各种状态,只抛出异常。

因为dao层的代码都比较短小,也没有各种业务异常状态,都是系统本身的异常。

而且dao层可能要切换dao层框架,导致不好切换。

2、service

通常要处理各种业务逻辑状态,并且捕获各种异常。

3、控制器

捕获异常;

并且,封装结果对象,返回结果对象给前端,前端js校验各种状态(成功,失败)。

参考

www.iteye.com/topic/2038?… //iteye robbin

www.zhihu.com/question/36…

time.geekbang.org/column/arti… //王争