lihongjie0209
2017-10-17 15:39:38 +08:00
取决于你的异常是不是真正的异常, 不要让异常作为你的条件判断或者是前置条件判断.
前置条件判断就是运行这个函数必须满足的条件, 比如你所说的类型错误, 这些条件应该在业务逻辑之前就检测并做出相应的应对措施, 而不是等待运行到业务代码的时候才退出, 这样的话你系统的状态就改变了, 你所谓的 try catch 也就没有什么作用了.
举个例子:
原版
用户输入: 正常参数 1, 异常参数 2
程序执行: 使用正常参数 1 执行删除操作
使用异常参数 2 执行添加操作
程序爆出异常, 你捕捉并打印
现在你系统的状态已经改变了, 用户参数是异常的, 但是用户却执行了删除操作.
改进 1:
用户输入: 正常参数 1, 异常参数 2
程序执行: 参数校验, 发现异常参数并提示用户
这样的话你就保证了系统的状态不会处于中间状态. 这叫做提早失败(我也忘记怎么翻译了)
改进 2:
用户输入: 正常参数 1, 异常参数 2
程序执行: 使用正常参数 1 执行删除操作
使用异常参数 2 执行添加操作
程序爆出异常, 你捕捉并在异常处理中执行回滚操作, 把删除操作回滚
这样也可以保证你系统的状态, 这叫做失败的原子性, 缺点也很明显, 你需要记录很多状态并手动执行事务管理, 而且有些状态是不可回滚的.
改进 3: 参考 java spring 中事务管理的实现, 我目前还没有看到这一块.
以上内容来自<effective java>.