错误和哨兵错误有什么区别?

7 error-handling go sentinel

在每个文档中,我都读到了类似的哨兵错误内容:

哨兵错误通常用于指示您无法启动或继续。

任何可能的错误也可能是这种情况,不是吗?因为在运行时任何意想不到的事情都可能发生。这是否意味着我期望在运行时出现错误,但可以或应该更好地处理,我是否调用哨兵错误?

然后我读了它们应该如何使用:

哨兵错误是在包级别声明的少数变量之一。Err他们的名字以(Exception )开头io.EOF。他们应该受到只读威胁。(Go 编译器无法强制执行此操作)。

在定义哨兵错误之前,请确保您需要一个。一旦定义,它就会成为您公共 API 的一部分,并且您已承诺在所有未来的向后兼容版本中提供它。

或者我处理它们的方式是否使它们成为哨兵错误?你能举个例子让我清楚地理解,有什么区别吗?

这样说会不会是错误的:错误,我想在运行时中充当哨兵,并且我在包根中明确定义变量(或常量)是哨兵错误?

我准备了一个例子;也许我们可以用它作为基础:https://go.dev/play/p/qwi4ligYZYh

Rav*_*Dev 2

哨兵错误的概念比计算机科学更具有语义意义。Digital Ocean 关于 Go 中错误处理的教程很好地解释了哨兵错误是什么(也是我学到的地方)。

哨兵错误是用户定义的错误,指示您作为开发人员预期并确定为足够重要以定义和指定的非常具体的事件。因此,您在包级别声明它们,并且这样做意味着您的包函数可能会返回这些错误(从而让您在将来维护这些错误,因为其他人将根据您的包检查它们)。

前任:

var VeryImportantError = fmt.ErrorF("Something very specific happened!")
[...]
if err == VeryImportantError {
    // handle very specific error in very specific way
}
Run Code Online (Sandbox Code Playgroud)

一般来说,这些错误“通常用于指示您无法启动或继续”。

简而言之,从编译器的角度来看,哨兵错误并不特殊。相反,它们是一种概念化某些特定错误的方法,开发人员希望以特定方式处理这些错误,因为它们表示特定的事情。