go语言之抛出异常panic和recover中“只有最后一次panic能被捕获”的理解

ameyume
博客专家认证
2019-07-23 07:56:45
可以有多个panic被抛出,连续多个panic的场景只能出现在延迟调用里面,否则不会出现多个panic被抛出的场景。但只有最后一次panic能被捕获
package main

import "fmt"

func main(){
defer func() {
if err :=recover();err !=nil{
fmt.Println(err)
}
}()
  //只有最后一次panic调用被捕获
defer func() {
panic("first defer panic") //打印结构是这个
}()
defer func() {
panic("second defer panic")
}()
panic("main body panic")
}


但只有最后一次panic能被捕获。这个是怎么理解的?
不是只有第一次的panic能被捕获吗?
输出的明明是第一个panic的内容啊:
  //只有最后一次panic调用被捕获
defer func() {
panic("first defer panic") //打印结构是这个
}()
defer func() {
panic("second defer panic")
}()
panic("main body panic")
...全文
254 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2019-07-24
  • 打赏
  • 举报
回复
是的,defer的执行顺序决定了你捕捉的是第一个defer的panic
ameyume 2019-07-24
  • 打赏
  • 举报
回复
自己找到了原因: 九、defer(延迟语句) defer语句会在函数返回前,从后到前的依次执行defer 参考:https://studygolang.com/articles/10838
ameyume 2019-07-24
  • 打赏
  • 举报
回复
panic("main body panic")这个是第一个的话,带defer的func panic("second defer panic")才是最后一个啊。还是不明白,高人来解释一下吧。

2,190

社区成员

发帖
与我相关
我的任务
社区描述
go语言学习与交流版
社区管理员
  • go语言社区
  • Freeman Z
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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