如何在recover中检查错误的具体类型?

mr1*_*011 1 go

我在这里遵循这个例子:

https://www.socketloop.com/tutorials/golang-smarter-error-handling-with-strings-contains-function

 if !strings.Contains(err.Error(), "timed out") {
    fmt.Printf("resulting error not a timeout: %s", err)
 }
Run Code Online (Sandbox Code Playgroud)

但是,如果我在代码中这样做,我会得到这个

err.Error未定义(类型interface {}是没有方法的接口)

我想知道我在这里做错了什么,以及我应该如何检查确切的错误(在我的情况下,我想从错误“切片边界超出范围”中恢复)

最好的,

cre*_*ker 5

使用类型断言获取error https://play.golang.org/p/BryV7YfZHS

defer func(){
    err := recover().(error)
    fmt.Println(err.Error())
}()

a := make([]int, 0)
a[1] = 0
Run Code Online (Sandbox Code Playgroud)

但我建议你不要这样做。首先,您不应该使用恢复。几乎在所有情况下,这都意味着您做错了什么。相反,修复出现问题的代码。

其次,不要使用字符串匹配来确定错误原因。它不好的原因有很多,但我只想说这不是 Go 的做事方式。我知道您可能正在使用 API,但它并没有给您留下选择的余地,而是尝试找到更好的方法。使用类型断言、类型开关来获取确切的错误类型并从那里开始。