go recover()没有效果,为什么

jinjiashan · 2017-08-24 15:59:04 · 1602 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-08-24 15:59:04 的主题,其中的信息可能已经有所发展或是发生改变。

import "fmt"
func main() {

    defer  func(){recover()}() //这个有效果, 为什么
    //defer recover()   //这个没有效果

    fmt.Println("before")
    panic("throw")
    fmt.Println("after")
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1602 次点击  
加入收藏 微博
2 回复  |  直到 2017-08-26 02:46:44
channel
channel · #1 · 8年之前

规范有明确规定,recover 必须放在 defer 中,但是不能被 defer 直接调用。

The return value of recover is nil if any of the following conditions holds:

  • panic's argument was nil;
  • the goroutine is not panicking;
  • recover was not called directly by a deferred function.

http://docs.studygolang.com/ref/spec#Handling_panics

jinjiashan
jinjiashan · #2 · 8年之前

厉害了, 这都找到了. 不过说真的, 不知道为什么要这样设计.go语言圣经里面也没有讲到, 只有趟过这个坑才能知道吗.

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传