触发panic
panic("crash")
捕获 panic
- recover 的使用,有一个条件,就是它必须在 defer 函数中才能生效,其他作用域下,它是不工作的。
- 即使 panic 会导致整个程序退出,但在退出前,若有 defer 延迟函数,还是得执行完 defer 。
- defer 在多个协程之间是没有效果,在子协程里触发 panic,只能触发自己协程内的 defer,而不能调用 main 协程里的 defer 函数的。
import (
"fmt"
"time"
)
func main() {
// 这个 defer 并不会执行
defer fmt.Println("in main")
go func() {
defer println("in goroutine")
panic("")
}()
time.Sleep(2 * time.Second)
}
失败时候拿到返回值
使用有参数返回
func (p *pool2) doWork(task Task) (res string) {
defer func() {
if err := recover(); err != nil {
log.Println(err)
res = "fail"
}
}()
return task.worker(task.params...)
}
网友评论