```go
package main
import (
"fmt"
)
func main() {
test()
}
func test() {
defer func() {
if err := recover(); err != nil {
fmt.Println("e1:",err)
}
}()
panic("no1")
defer func() {
if err := recover(); err != nil {
fmt.Println("e2:",err)
}
}()
panic("no2")
}
```
本以为会输出no1、no2,但只输出no1<br>
以为panic("no1")会被第1个recover捕获,然后继续执行panic("no2")<br>
为什么recover会导致退出当前函数?<br>
以上panic是手动panic的,go能否根据一段代码进行判断,然后自动panic?<br>
更多评论
1、panic 了,程序在 panic 处中断,recover 只是保证整个程序不会终止;
2、自动 panic ,那是程序有bug,比如
```go
var p *string = nil
*p = "studygolang"
```
会自动 panic
#1
协程所在panic了,类似于,该协程发出了杀死进程的指令,但是被该协程的recover挡下来了。但是就算挡下来了,虽然进程没受影响,但是协程,还是死了。而他死前最后一口气,就是用defer recover把他panic的原因,打印下来
#3