0%

不要忽略错误

Don’t Ignore that Error!

一天傍晚我走在一条街道上准备去酒吧见几个朋友。我们已经有段时间没一起和啤酒了,我很期待再见到他们。仓忙之中,我没有看路。我被路边缘给绊倒了,脸贴地。好吧,我猜这是对我粗心大意的正确处置。
腿受伤了,但我急着见我的朋友。因此爬起来继续。走没多远远疼痛加剧。尽管刚开始我想这只是阵痛,很快我就意识到错了。
但我没理会,抓紧去酒吧。终于到了,痛苦万分。我并没有度过一个愉快的夜晚,因为总觉得很疼。第二天一早我就去看医生,发现我胫骨骨折了。当时觉得疼的时候就停下来,我就能防止因为走路造成的更大伤害。那可能是我生命中最糟糕的一个早上了。

很多程序员写代码就像我那个悲催的夜晚。

错误,什么错误?又不严重。老实说,我能忽略它。这可不是一个能巩固代码的策略。事实上,这只是纯粹的懒惰。(错误的排序)不管你多不喜欢思考你代码中的错误,你都应该检查它,并总是把它处理掉。任何时候。如果你不这么做,就无法节省时间:你只是在给未来积攒潜在的问题而已。

我们报告代码中的错误有很多种方式,包括:

  • 返回(错误)码可以用作一个函数的返回值,以表示“它没有在工作”。错误返回码太容易被忽略。你可能无法从代码中看到任何明显的问题。的确,忽略某些标准C函数的返回值已经成为标准做法。你可曾检查printf的返回值?
  • errno是C语言的异常码,一个单独的全局变量,用来设置错误信号。它很容易被忽略,不好用,并导致各种令人讨厌的问题——例如,当你在多线程里调用相同的函数会发生什么?有些平台可以避免你的痛苦;有些则不行。
  • 异常是更多结构化语言支持的错误信号及捕获机制。并且你无法忽略他们。或者你可以?我看到很多类似这样的代码:
    1
    2
    3
    4
    try {
    // ...do something...
    }
    catch (...) {} // ignore errors

这种可怕的结构的优点在于它强调了你所做的道德上的可疑事实(译注:我不明白try-catch和道德有什么关系🤔️)

如果你忽略错误、视而不见、假装没有什么事情出错,你在酝酿一个大风险。正如我的腿最终处于一个很糟糕的状态,是因为我没有立刻停止走动,毫无责任心的耕耘总会酿成大祸。在最早有条件的时候把问题处理掉。轻装上阵。

不处理错误将导致:

  • 脆弱的代码。代码里充满令人兴奋、难以发现的bug。
  • 不安全的代码。破解者们经常利用一些低级错误处理来入侵软件系统。
  • 不良的结构。如果你代码中有冗长而无法持续处理的错误,你很可能有一个不良的接口。干掉它,以便更少的错误入侵以及处理起来不那么繁重。

就像你应该检查代码中所有潜在的错误一样,你需要揭露接口中所有潜在的错误情况。不要隐藏他们,假装你的服务总可以工作。

为什么我们不检查错误?有很多常见的借口。你会同意哪一个?又会如何反对每一个?

  • 处理错误会搅浑代码流程,让其变得难读,并更难看到“正常”执行流程。
  • 它会增加额外工作,我的交付期限快到了。
  • 我知道这些函数调用永远不会返回错误(printf总能工作,malloc总会返回一个新内存空间——如果它都失败了,我们会有一个更大的问题…)
  • 这只是一个玩具程序,没必要按生产价值的水平来编写吧。
小小鼓励,大大心意!