先讲一个故事:
一天晚上我正匆匆忙忙走在街道上准备去一个酒吧会见几个老朋友。我在匆忙中没注意脚下的路,我被路上的某个东西绊倒了。
我意识到腿很疼,但我急于见老朋友,所以我挣扎着站起来并继续往前走,但是当我走的越多疼痛就越加剧,所以我意识到肯定伤的不轻。
但我还是赶去了酒吧,那晚上在酒吧过的并不愉快,因为腿上的疼痛让我分心。第二天早上我去看医生,发现我的胫骨骨折了。在我跌倒起身意识到疼痛后停止了吗?没有,反而因为拖延多走了路造成了额外伤害,也许那天早晨是我这辈子最糟糕的早晨。
太多的程序员写代码就像我那糟糕的夜晚。^_^
错误,啥错误?没啥大问题,直接忽略即可!对于想开发可靠,健壮的代码而言这可不是一个好的策略。事实上,这就是懒惰。不管你认为一个错误有多不可能在你系统里发生,你都应该检查并处理它。 每次当你不这么做,你不是在节省时间,你是在为未来埋坑。
通常,我们通过以下几种方式报错:
- 返回码(return code) : 用特殊的返回码从函数返回表示函数调用异常。通过返回码的形式特别容易被忽略。
- 错误码(errno): 即用一个全局变量标识错误。它易被忽略,难用,会遭致诡异的异常,如多线程调用同样的函数导致变量的修改。
- 异常对象(Exception): 高级语言加入的异常处理机制。一般不太容易忽略,但也不是一定不可以,如下列代码:
try {
// do something...
} catch(Exception e) {
// ignore errors.
}
上面的代码非常可怕,会掩盖事实真相,甚至是不道德的。当到生产环境
如果你忽略一个错误,假装看不到,你将会冒很大的风险,应该尽早解决错误问题。
不处理错误将会导致:
- 脆弱的代码:代码充满令人吃惊的,难以发现的bug。
- 不安全的代码:黑客经常利用系统错误处理能力差来侵入系统。
- 不良的结构:如果代码中充斥着错误处理代码,那说明接口定义差。
就像你需要检查代码中所有的潜在错误,你需要通过接口暴露所有可能的错误情况。千万不要隐藏它们,假装你的服务一直工作正常。
为什么我们不想检查并处理错误?有若干种借口:
- 错误处理会导致代码流程混乱,使得程序可读性差。
- 这是额外的工作并且deadline快到了。
- 我知道这个函数一定不会出问题(如果出了整个系统就是崩溃了,完全无法用了)
- 这仅仅是示例代码,完全不用写的够严谨,达到生产级。
小结
通过故事的类比,我们需要意识到有错误就要解决,不要试图掩盖,存在侥幸心理,否则在未来的某个时间点会付出更大的代价。