阿小信大人的头像
Talk is cheap. Show me the code. Linus Torvalds

goroutine 中的 panic 处理小结2021-01-08 22:34

在 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。

若非特别声明,文章均为阿小信的个人笔记,转载请注明出处。文章如有侵权内容,请联系我,我会及时删除。

#Golang#  
分享到:
阅读[430]

你可能也感兴趣的文章推荐

本文最近访客

网友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