业务流程控制的选择
一直以来都是自学技术,工作之后更多的是写业务了.
一直有个疑问,在写业务流程的时候
逻辑判断是用Exception控制还是if else?
一直在思考这个问题,在网上也找过很多资料,就是想找个准确的答案,让自己按照这个答案或者说规范写
业务,因为个人选择性困难,总是想选择最好的,不然写代码的时候会很纠结,总是思考用哪个好.
网上说了很多,主要是2种 Exception和if else
if else
可能是先入为主的原因,学C语言的时候更多的是使用
1
2
3
return -1;
return 1;
return 0;
优点 :
方式直观,简单
相对高效
粒度更小
缺点 :
需要定义各种错误代码,一层一层返回.
如果业务特别复杂,那么可读性就差
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
if ( ! function1(x,x) ) {
// 错误
}
if ( ! function2(x,x) ) {
// 错误
}
if ( ! function3(x,x) ) {
// 错误
}
// ----------------------------------------------------------------
// 如果说某个方法不只是 true false 这2种情况呢?
private boolean function1(a,b) {
if ( a == 1 ) {
// 用户未注册
return false;
}
if ( a == 2 ) {
// 用户名错误
return false;
}
return true;
}
if ( ! function1(x,x) ) {
// 那么我这里想返回到底是如何返回呢?
// 是修改这方法呢?不返回boolean类型,改为状态码?
// 那代码不是不够优雅了,还要绞尽脑汁想很多状态码?
// 还是构建一个Result类,封装下,信息和状态码同时返回?
// 这样会不会增加复杂度,阅读性是不是会不够好了?
}
if ( ! function2(x,x) ) {
// 错误
}
if ( ! function3(x,x) ) {
// 错误
}
// ... ...
这个问题纠结了我好一段时间,刚开始工作,因为自己学历还有工作经验,刚开始也只能进普普通通
的公司. 开始写业务的时候,在service中都是用if else进行控制流程,随着业务的复杂度提高自己也意
识到,这样的弊端,可读性不好,代码不够优雅.随即去问同事,同事也是半桶水,写得更烂,白问.在网上
找答案也是没个中肯的,可能也是自己当时技术和经验不够,分不清对错
A
优点 : xxx ,缺点 : xxx
B
优点 : xxx, 缺点 : xxx
如何选?
其实现在想来没有什么对错,不能说只能用A就不能用B了,还是要看情况选择.
Exception
优点 :
异常不需要占用返回值,不用去思考返回值如何定义
异常可以简化复杂的错误处理代码
错误处理的策略明显,OO语言更倾向异常(确实,C没有异常)
省代码,可读性强
缺点 :
粒度较笼统
效率没有if高
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
result = service1();
if ( "200" == result ) {
// 如何处理?
} else if ( "300" === result ) {
// ...
} else {
// ...
}
result = service2();
if ( "200" == result ) {
// 如何处理?
} else if ( "300" === result ) {
// ...
} else {
// ...
}
// ----------------------------------------------------------------
// 异常
try {
service1();
service2();
} catch (AException e) {
//
} catch (BException e) {
//
}
实际敲代码,使用if else 和 Exception前后比较


实际中使用异常做为业务流程控制,代码量少了,代码可读性强了.
其他看法
至于到底选择哪个? 看了阿里巴Java开发手册其中有几条是关于异常处理的
【强制】异常不要用来做流程控制,条件控制,因为异常的处理效率比条件分支低
【推荐】在代码中使用“抛异常”还是“返回错误码”,对于公司外的 http/api 开放接口必须 使用“错误码”;而应用内部推荐异常抛出;跨应用间 RPC 调用优先考虑使用 Result 方式,封 装 isSuccess、“错误码”、“错误简短信息”。
说明:关于 RPC 方法返回方式使用 Result 方式的理由:
1)使用抛异常返回方式,调用方如果没有捕获到就会产生运行时错误。
2)如果不加栈信息,只是new自定义异常,加入自己的理解的error message,对于调用 端解决问题的帮助不会太多。如果加了栈信息,在频繁调用出错的情况下,数据序列化和传输 的性能损耗也是问题。
关于用异常控制程序流程的看法
http://www.iteye.com/topic/1112683?page=3
个人觉得看情况吧,接口对内可以使用Exception处理,接口对外则使用if else返回错误码.
.