多个panic,recover如何写?

weixin_38065454 2019-09-20 10:26:36
```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>
...全文
50 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38090274 2019-09-20
  • 打赏
  • 举报
回复
原来是这样,我还以为recover后,能继续往下执行呢。不同于java中的try..catch(){},在捕获后能继续执行<br>
weixin_38092995 2019-09-20
  • 打赏
  • 举报
回复
协程所在panic了,类似于,该协程发出了杀死进程的指令,但是被该协程的recover挡下来了。但是就算挡下来了,虽然进程没受影响,但是协程,还是死了。而他死前最后一口气,就是用defer recover把他panic的原因,打印下来
weixin_38120550 2019-09-20
  • 打赏
  • 举报
回复
建议做统一的recover封装,类似: ```golang package main import ( "fmt" "github.com/nothollyhigh/kiss/util" ) func test() { defer util.HandlePanic() fmt.Println(111) panic("err 1") fmt.Println(222) } func main() { test() } ``` 输出: ```text PS C:\Users\Administrator\Desktop> go run .\test.go 111 2019-09-01 17:46:20.315 [Error] [panic.go:43] --------------------------------------- runtime error: err 1 traceback: stack: 1 true [file: C:/Users/Administrator/Desktop/test.go] [func: main.test] [line: 12] stack: 2 true [file: C:/Users/Administrator/Desktop/test.go] [func: main.main] [line: 17] stack: 3 true [file: d:/dev/go/src/runtime/proc.go] [func: runtime.main] [line: 200] stack: 4 true [file: d:/dev/go/src/runtime/asm_amd64.s] [func: runtime.goexit] [line: 1337] --------------------------------------- ```
weixin_38069520 2019-09-20
  • 打赏
  • 举报
回复
1、panic 了,程序在 panic 处中断,recover 只是保证整个程序不会终止; 2、自动 panic ,那是程序有bug,比如 ```go var p *string = nil *p = "studygolang" ``` 会自动 panic

435

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧