在 go 的函数中使用 defer + recover 不能捕获在当前函数里面新开的 goroutine 的 panic。 在新的 goroutine 里面 panic 了即使上层有 recover 也会导致进程退出。
原因在于 panic 仅保证当前 goroutine 下的 defer 都会被调到,但不保证其他协程的defer也会调到。 panic 发生时会先处理完当前goroutine已经defer挂上去的任务,执行完毕后再退出整个程序(注意是退出进程而不只是协程)。
因此在开新的 goroutine 的时候,一定要要注意这里,不要以为最外层有了 recover 程序就一定不会挂。 新的 goroutine 里面需要自己处理 panic,或者在外层定义一个 channel , goroutine 内部捕获到异常后把异常塞到这个 channel 中,上层监听到 goroutine 内部的异常后再在当前层进行 panic, 这样就把底层的 panic 抛到了上层,交由上层的 recover 统一处理。
recover 出来的 panic 是个 interface{} 而不是 error。
网友49.*.*.81[火星]2021-04-19 11:01
网友101.*.*.140[火星]2021-04-19 10:38
网友54.*.*.161[法国]2021-04-19 10:38
网友66.*.*.20[火星]2021-04-19 10:14
发表评论
亲~ 评论内容是必须的哟! o(∩_∩)o
昵称
邮箱
主页
评论