golang恢复返回值语法

时间:2014-09-03 07:40:21

标签: go

我正在努力了解如何从恐慌情况中恢复过来。通常,这样的事情会做:

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

我能理解那些。但我已经看到了如下代码片段:

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

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

1 个答案:

答案 0 :(得分:17)

type assertion 会检查error recovered是否属于某种类型。

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

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

您可以在" Error handling and Go"

中查看示例
  

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

     

例如,网络抓取工具可能:

     
      
  • 睡眠并在遇到临时错误时重试
  •   
  • 然后放弃。
  •   
if nerr, ok := err.(net.Error); ok && nerr.Temporary() {
    time.Sleep(1e9)
    continue
}
if err != nil {
    log.Fatal(err)
}

如果您要恢复几种类型的错误,可以使用类型开关,并在#34; Golang: returning from defer"

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
    }
}()