golang恢复返回值语法

lan*_*ng2 9 go

我试图了解如何从恐慌情况中恢复过来.通常,这样的事情会做:

 if r := recover(); r != nil {
    fmt.Println("Recovered in f", r)
 }
Run Code Online (Sandbox Code Playgroud)

我能理解那些.但我看到的代码片段如下:

 if r, ok := recover().(error); ok {
    fmt.Println("Recovered in f", r)
 }
Run Code Online (Sandbox Code Playgroud)

什么是.(错误)部分在做什么?

Von*_*onC 18

它是一种类型断言,用于检查恢复错误是否属于某种类型.

类型断言失败,导致运行时错误继续堆栈展开,好像没有任何中断它.

当您MyError为错误定义本地类型并且只想从该类型恢复时,这非常有用.

您可以在" 错误处理和转到 "中看到一个示例

客户端代码可以使用类型断言测试net.Error,然后将瞬态网络错误与永久网络错误区分开来.

例如,网络爬虫可能:

  • 睡觉并在遇到临时错误时重试
  • 否则就放弃了.
if nerr, ok := err.(net.Error); ok && nerr.Temporary() {
    time.Sleep(1e9)
    continue
}
if err != nil {
    log.Fatal(err)
}
Run Code Online (Sandbox Code Playgroud)

如果你有几个要恢复类型的错误,你可以使用一个类型开关处于" Golang:从推迟回国 "

defer func() {
    if r := recover(); r != nil {
        fmt.Println("Recovered in f", r)
        // find out exactly what the error was and set err
        switch x := r.(type) {
        case string:
            err = errors.New(x)
        case error:
            err = x
        default:
            // Fallback err (per specs, error strings should be lowercase w/o punctuation
            err = errors.New("unknown panic")
        }
        // invalidate rep
        rep = nil
        // return the modified err and rep
    }
}()
Run Code Online (Sandbox Code Playgroud)