##关于golang的异常捕获
**由于golang没有像Java、php语言的try{}catch{}的异常处理,因此在程序发生panic后就导致整个应用程序挂掉非常的不友好。**
```javascript
func modNum() {
defer func() {
if err := recover(); err != nil {
fmt.Println("协程捕获异常:", err)
}
}()
num := 0
fmt.Println(11 / num)
}
func main() {
defer func() {
r := recover()
if err, ok := r.(error); ok {
fmt.Println("捕获异常:", err)
}
}()
//1.可以捕获到异常
//modNum()
//2.捕获不到异常
go modNum()
panic(errors.New("main:err")
}
```
##总结
**gorouting发生panic时,只会调用自身的defer,所以即使在main的gorouting写了recover逻辑,也无法捕获到其它gorouing里的panic。所以在使用协程时,如不能保证不发生panic,尽量还是使用recover进行捕获异常**
我觉得楼主的这个话题比较伪命题, 因为不管是哪里用recover恢复现场, 只要处理过了就不会让程序挂掉.
你如果在协程里用了recover还不满意 需要继续向上panic的话, 你可以在defer的执行recover程序块里再一次panic看发生什么?
#1
更多评论
这种应该是没啥关系吧, 只要作为一种编程规范在开启协程入口处加上defer recover不就可以了吗, 尤其是那种有依赖调用其他函数有可能挂掉的协程, 其他语言如果你没有捕获全局异常的话一样不友好直接整个程序挂掉退出了. go的很多框架都是这么做的.
#3