1
lihongjie0209 2017-10-17 15:39:38 +08:00 2
取决于你的异常是不是真正的异常, 不要让异常作为你的条件判断或者是前置条件判断.
前置条件判断就是运行这个函数必须满足的条件, 比如你所说的类型错误, 这些条件应该在业务逻辑之前就检测并做出相应的应对措施, 而不是等待运行到业务代码的时候才退出, 这样的话你系统的状态就改变了, 你所谓的 try catch 也就没有什么作用了. 举个例子: 原版 用户输入: 正常参数 1, 异常参数 2 程序执行: 使用正常参数 1 执行删除操作 使用异常参数 2 执行添加操作 程序爆出异常, 你捕捉并打印 现在你系统的状态已经改变了, 用户参数是异常的, 但是用户却执行了删除操作. 改进 1: 用户输入: 正常参数 1, 异常参数 2 程序执行: 参数校验, 发现异常参数并提示用户 这样的话你就保证了系统的状态不会处于中间状态. 这叫做提早失败(我也忘记怎么翻译了) 改进 2: 用户输入: 正常参数 1, 异常参数 2 程序执行: 使用正常参数 1 执行删除操作 使用异常参数 2 执行添加操作 程序爆出异常, 你捕捉并在异常处理中执行回滚操作, 把删除操作回滚 这样也可以保证你系统的状态, 这叫做失败的原子性, 缺点也很明显, 你需要记录很多状态并手动执行事务管理, 而且有些状态是不可回滚的. 改进 3: 参考 java spring 中事务管理的实现, 我目前还没有看到这一块. 以上内容来自<effective java>. |
2
wy315700 2017-10-17 15:53:54 +08:00 2
90%以上的代码其实都是为各种异常状况而写的。。。
|
3
readercn 2017-10-17 16:05:17 +08:00
先检查参数异常,各种 edge case,有问题就 return error 吧,最后处理业务代码。
|
4
arnoldFu 2017-10-17 16:10:24 +08:00
执行前进行参数校验
|
5
cloverstd 2017-10-17 16:12:47 +08:00
就算是弱类型语言,用户输入的你也要检查吧
不能全部让『前端』做校验 |
6
Sapp 2017-10-17 16:46:47 +08:00
如果不用考虑各种蛋疼情况,写业务该是多简单?因为你总想象不出来用户能玩出来什么花样,demo 和上线产品的区别之一就是应对各种复杂情况的处理吧?
|
7
q397064399 2017-10-17 16:59:05 +08:00
@Sapp 如果不用覆盖各种变态的边界条件 还要程序员干嘛
|
8
jswh 2017-10-17 17:04:09 +08:00
防御性编程,不要等到代码出错。
|
9
loading 2017-10-17 17:18:45 +08:00
if err != nil
你知道我上面这一个写了多少次?结果就是,我已经写到我键盘宏里面了。。。 |
10
Livid MOD |
11
Todd_Leo 2017-10-18 01:00:27 +08:00
尝试在生产代码中把你的异常处理用 if...else...语句替换吧, 因为经过充分的测试后你需要对代码中哪里会出现什么异常非常清楚.
|
12
atcdef 2017-10-18 07:40:51 +08:00
用户输入必须检查其合法性,因为万一你的用户是一只狗坐在电脑前呢
|