首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >golang recover返回值语法

golang recover返回值语法
EN

Stack Overflow用户
提问于 2014-09-03 15:40:21
回答 1查看 11.8K关注 0票数 10

我在试着理解如何从恐慌中恢复过来。通常,像这样的代码就可以了:

代码语言:javascript
复制
 if r := recover(); r != nil {
    fmt.Println("Recovered in f", r)
 }

这些我都能理解。但我见过如下代码片段:

代码语言:javascript
复制
 if r, ok := recover().(error); ok {
    fmt.Println("Recovered in f", r)
 }

.(error)部分在做什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-03 15:44:18

它是一个检查error recovered是否属于某个类型的。

如果类型断言失败,则会导致运行时错误,从而继续堆栈展开,就好像没有任何东西中断它一样。

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

你可以在"Error handling and Go“中看到一个例子。

客户端代码可以使用类型断言测试net.Error,然后区分暂时的网络错误和永久性的网络错误。

例如,web爬虫可能会:

  • 遇到临时错误时休眠并重试
  • ,否则放弃。

代码语言:javascript
复制
if nerr, ok := err.(net.Error); ok && nerr.Temporary() {
    time.Sleep(1e9)
    continue
}
if err != nil {
    log.Fatal(err)
}

如果您有几种想要恢复的错误类型,您可以使用类型开关is in "Golang: returning from defer

代码语言:javascript
复制
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
    }
}()
票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25638842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档