错误模型(一)
错误模型试图回答的基本问题是:如何将“错误”传达给程序员和系统用户?
在回答这个问题时,最大的挑战之一就是定义错误的实际含义。大多数语言将Bug和可恢复的错误归为同一类,并使用相同的工具来处理它们。例如空引用或越界数组访问的处理方式与网络连接问题或解析错误相同。乍一看,这种一致性似乎不错,但它有根深蒂固的问题。尤其是,它具有误导性,并且经常导致不可靠的代码。
我们的总体解决方案是提供一个双管齐下的错误模型。一方面,由于编程错误,产生了fail-fast 异常,我们称之为快速终止。另一方面,您已经静态地检查了可恢复错误的异常。两者在编程模型和背后的机制上都非常不同。快速终止在一瞬间毫无歉意地破坏了整个过程,拒绝运行任何用户代码。)当然,异常有助于恢复,但是有深层类型的系统支持来帮助检查和验证。
这趟旅程漫长而曲折。为了讲述这个故事,我把这篇文章分成六个主要方面:
- 基础知识
- Bug是不可恢复的错误!
- 可靠性、容错性和隔离性
- Bug:终止、断言和契约
- 可恢复错误:类型定向异常
- 回顾与结论
事后看来,某些结果似乎显而易见。尤其是考虑到现代系统语言如Go和Rust。但有些结果让我们吃惊。我会尽我所能直截了当地去追索,但我会一路上给你充分的回馈。我们尝试了很多没用的东西,我想这比尘埃落定时的结局更有趣。
- 上一篇: 仅通过转储来排除内存泄漏
- 下一篇: 使用Java中的InputStream读取文件数据