讨论下接口定义时如何传递错误码

clariones 2015-05-12 08:39:05
各位大神,讨论下接口定义如何制定错误处理原则,主要是错误需要参与到流程中的情况。

java提到错误处理就是异常,但是实际业务没有这么理想。 例如,假设一个简单任务,需要A,B,C,D 4个步骤,流程为:
先做A, 如果A发现输入有误,那么记日志,执行B, 如果正确,执行C;
B,C执行完成之后,执行D。

现在想讨论的是A,B,C的接口定义中,如何表达错误信息。
有3个选择:
1. 所有接口都用返回值传递‘结果数据’,用异常传递错误信息
2. 定义一个通用结构,用返回值包含‘结果数据’和错误信息
3. 根据情况,用异常或者返回值表示
这些都不是很理想的解决方案。

如果全用异常,代码大概会是这个样子

foo(input){
Object someData;
try{
someData = StepA.doSomething(input));
someData = StepC.doSomething(input);
}catch(Exception stepAExcpt){
Log("Step A..., the data is ..." + stepAExcpt.getErrorData);
SomeData = StepB.doSomething(input);
}
someData = StepD.doSomething(input);
return someData;
}

很显然,不好的编码风格。

如果全部用统一结构定义返回值+返回码,那么侵入性太大,不过代码倒是容易理解

foo(input) throw AnyOtherException{
if(StepA.do(input).error){
StepB.do(input);
}else{
StepC.do(input);
}
StepD.do(input);
}

// 可是StepA的接口只能写成
StepA.do(input){
Result result = new Result();
if (hasError(input)){
result.setError(true);
return result;
}
// 。。。。。。一些处理逻辑
result.setData(someResultData);
return result;
}

所有接口都这么干,也很不好。

第三种就更不可捉摸,碰到只需要返回成功失败,不需要数据的情况,还好,假设碰到一个复杂情况,错误时需要返回确切的错误信息,成功是需要返回特定的数据,就又面临混乱了。

各位觉得怎么样比较好呢?
...全文
350 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
doony 2015-05-15
  • 打赏
  • 举报
回复
简单点的做法就是约定好异常的信息, 对于这种步骤形式的,可以用位的方式来标记, 比如4个步骤,每个步骤2位状态码,状态码(可以是正常的,也可以是异常码)可以是数字,一共就8位,xxxxxxxx, 这样每个步骤能容纳的状态就是99种,一般都能满足你使用的了。 如果执行到某个步骤,就要中断退出,则直接定义好中断信号,直接跳出整个执行过程。 状态位信号机的使用很灵活,特别适应你说的这个步骤场景。 返回给调用方的值怎么拆分组织是约定的事了。
finemi 2015-05-13
  • 打赏
  • 举报
回复
你这问题我之前也问了啊~~一模一样。。 发现你们有开发经验的和我还在学校的描述是不一样- - 网上找了一大堆资料,CSDN也问了,老师也问了,最后得出的结论是: 这两种实际上目前大多都模棱两可,意思就说爱用谁用谁。我那问题我再等等看看有没有大神级别的答案吧~ 给你个支持异常的说得很好:http://blog.163.com/hotman_x.vip/blog/static/4895013320120282174842/
clariones 2015-05-12
  • 打赏
  • 举报
回复
方案1在业务简单的情况下,也没什么大问题,实际的业务通常很复杂,函数级别的接口先相对来说这种问题少一些,但是模块或者子系统级别,需要传递的数据就比较多,一类是业务数据,一类是错误信息,某种程度上,错误信息也是业务信息,因为一个系统的日志子系统通常在后期是需求补充的最多的,如果前期没有准备好,后面改动很麻烦,所以想请教各位,看看大家觉得哪种方式比较能够兼顾到维护性和简洁性。
skgary 2015-05-12
  • 打赏
  • 举报
回复
应该是第一种吧,输入异常和处理异常都属于异常,但可以在异常中定义 不同的状态表示哪里出错了。
糖几颗的 2015-05-12
  • 打赏
  • 举报
回复
我比较倾向于第一种方案... 因为try catch finally 的逻辑刚好跟你需要的逻辑是一样的... 而且就算你用方案2写了, 还是要加try catch 来捕获未知的异常... 倒是没觉得方案一的编码风格有什么问题....... 总之两个方案, 都能解决你的问题... 但如果你有这种编码风格上的洁癖... 那就按照自己喜欢的方式来吧...
rumlee 2015-05-12
  • 打赏
  • 举报
回复
引用 2 楼 rumlee 的回复:
先做A, 如果A发现输入有误,那么记日志,执行B, 如果正确,执行C;
A发现有错误,这种根本不能算是异常,不应该采用异常来处理。 建议一般来说对于一些不可预见的情况可以采用异常来处理,而你这种既然是可以预见的,通过正常的程序处理逻辑来处理应该会更好。 也就是说我会考虑你的方案2
rumlee 2015-05-12
  • 打赏
  • 举报
回复
先做A, 如果A发现输入有误,那么记日志,执行B, 如果正确,执行C;
风吹过夏天 2015-05-12
  • 打赏
  • 举报
回复
实习生目前只考虑能实现就好,没考虑过怎么实现更好。

62,633

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧