iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Golang中panic与recover的区别
  • 953
分享到

Golang中panic与recover的区别

2024-04-02 19:04:59 953人浏览 独家记忆
摘要

目录前言流程关于recover前言 与defer类似的是,Goroutine 中也有一个_panic链表头指针指向一个_panic链,发生panic的时候也是在链表头插入_panic

前言

与defer类似的是,Goroutine 中也有一个_panic链表头指针指向一个_panic链,发生panic的时候也是在链表头插入_panic结构体(执行gopanic)

在执行过程中发生了panic。那么panic以后的代码不会执行,转而执行panic的逻辑,再执行defer,执行到的defer要将started标记为true,同时将其defer结构体中的_panic指针指向当前的_panic,表示这个defer是由该panic触发的。再去执行defer链表,如果defer执行中还触发了panic,panic后的代码不载执行,将这个panic插入panic链头,同时将其作为当前panic。当遇到了与当前panic不符的defer,就找到该defer上的panic,将其标记为已终止,从defer链表中移除当前执行的defer。打印panic移除信息,从链表尾开始逐步输出

流程

panic执行defer的流程:

  • 先标记started=true,_panic=&panic
  • 后释放
  • 目的是为了终止之前发生的panic

异常信息的输出方式:

  • 所有还在panic链表上的项会被输出
  • 顺序与发生panic的顺序一致

// A _panic holds infORMation about an active panic.
//
// A _panic value must only ever live on the stack.
//
// The argp and link fields are stack pointers, but don't need special
// handling during stack growth: because they are pointer-typed and
// _panic values only live on the stack, regular stack pointer
// adjustment takes care of them.
type _panic struct {
    // argp 存储当前要执行的defer的函数参数地址
	argp      unsafe.Pointer // pointer to arguments of deferred call run during panic; cannot move - known to liblink
	// arg panic函数自己的参数
    arg       interface{}    // argument to panic
    // link,链到之前发生的panic
	link      *_panic        // link to earlier panic
	pc        uintptr        // where to return to in runtime if this panic is bypassed
	sp        unsafe.Pointer // where to return to in runtime if this panic is bypassed
	// recovered 标识panic是否被恢复
    recovered bool           // whether this panic is over
    // aborted 标识panic是否被终止
	aborted   bool           // the panic was aborted
	goexit    bool
}

关于recover

recover只执行一件事

  • 将当前执行的panic的recovered字段置为true

在每个defer执行完以后panic处理流程都会检查当前panic是否被recover

  • 如果当前panic已经被恢复,就会将它从panic链中移除
  • 执行到的defer也会被移除,同时要保存_defer.sp和_defer.pc

利用_defer.sp和_defer.pc跳出当前panic的处理流程,通过栈指针判断,只执行当前函数中注册的defer函数

在发生recover的函数正常结束后才会进入到检测panic是否被恢复的流程

当recover的函数又发生panic时,goroutine会将该panic加入到链头,设置为当前panic,再去执行defer链表,发现当前defer是当前panic执行的,移除当前defer,继续执行下一个,直到发现不是当前panic执行的,在panic链上找到那个panic,输出异常信息

对于已经recover标记的panic在输出异常信息时会加上recovered标记

到此这篇关于golang中panic与recover的区别的文章就介绍到这了,更多相关Go panic recover内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: Golang中panic与recover的区别

本文链接: https://www.lsjlt.com/news/150877.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Golang中panic与recover的区别
    目录前言流程关于recover前言 与defer类似的是,goroutine 中也有一个_panic链表头指针指向一个_panic链,发生panic的时候也是在链表头插入_panic...
    99+
    2022-11-13
  • Golang中panic与recover的区别是什么
    这篇文章主要介绍“Golang中panic与recover的区别是什么”,在日常操作中,相信很多人在Golang中panic与recover的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Golan...
    99+
    2023-07-02
  • Golang错误捕获Panic与Recover的使用
    目录一、Golang 错误是什么?二、错误校验1.方法2.判断错误三、错误捕获1.方法2.defer 的使用总结一、Golang 错误是什么? 对于Go语言(Golang)的错误是通...
    99+
    2022-11-13
  • 一文带你掌握Golang中panic与recover的使用方法
    目录panicrecoverdefer/panic/recover示例panic panic作用是终止当前正在运行的程序(包括所有协程)并输出导致异常的堆栈信息。在遇到无法处理的异常...
    99+
    2023-05-18
    Golang panic recover使用方法 Golang panic recover Golang panic Golang recover
  • GoLang中panic与recover函数以及defer语句超详细讲解
    目录一、运行时恐慌panic二、panic被引发到程序终止经历的过程三、有意引发一个panic并让panic包含一个值四、施加应对panic的保护措施从而避免程序崩溃五、多条defe...
    99+
    2023-01-11
    Go panic函数 Go recover函数 Go defer语句
  • Go中的panic/recover简介与实践记录
    目录简介1.特性2.panic触发流程3.recover使用要点4.使用场景一、实践1.跨线程失效2.不起作用的recover3.嵌套使用panic4.注意事项小结简介 go语言追求...
    99+
    2023-05-18
    go panic recover go panic recover使用
  • Golang异常处理之defer,panic,recover的使用详解
    目录延迟是什么延迟函数延迟⽅法延迟参数堆栈的推迟延迟的应⽤panic和recover(宕机和宕机恢复)panic和recover机制示例代码延迟是什么 defer即延迟语句,极个别的...
    99+
    2022-11-13
  • 小学生也能看懂的Golang异常处理recover panic
    🌌 专注Golang,Python语言,云原生,人工智能领域得博主 💜 过去经历的意义在于引导你,而非定义你, 💜 只要我们足够努力,...
    99+
    2022-11-12
  • java与golang区别
    Java和Golang都是目前非常流行的编程语言,Java一直是企业级应用程序的首选,而Golang则是近年来快速崛起的后起之秀。两者都有自己的优缺点,本文将探讨Java和Golang在以下几个方面的区别。语言发展历史Java最早于1991...
    99+
    2023-05-15
  • golang与c 区别
    近年来,由于计算机领域的快速发展和新技术的不断涌现,很多新的编程语言被不断推出。Golang与C 作为两种编程语言,分别具有自己的特点和优劣势。在本文中,将对Golang和C语言进行比较,以便更好地了解它们的区别和使用情况。语法差异Gola...
    99+
    2023-05-14
  • Golang中panic的异常处理
    目录前言如何恢复panic造成的程序崩溃何时使用panic前言 Golang中当程序发生致命异常时(比如数组下标越界,注意这里的异常并不是error),Golang程序会panic(...
    99+
    2022-11-11
  • golang中new与make的区别讲解
    目录new和makenew使用new初始化零值new(struct)和&struct{}区别小结make使用示例总结:new和make new // The new buil...
    99+
    2023-01-12
    golang中new与make的区别 golang中new与make golang new go make
  • golang 中 recover()的使用方法
    Recover 是一个Go语言的内建函数,可以让进入宕机流程中的 goroutine 恢复过来,recover 仅在延迟函数 defer 中有效,在正常的执行过程中,调用 recov...
    99+
    2022-11-13
  • golang中堆与栈的区别有哪些
    本篇内容介绍了“golang中堆与栈的区别有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!堆与栈的区别:1、堆是用于存放进程执行中被动态...
    99+
    2023-07-05
  • Nodejs与Golang有什么区别
    本文小编为大家详细介绍“Nodejs与Golang有什么区别”,内容详细,步骤清晰,细节处理妥当,希望这篇“Nodejs与Golang有什么区别”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。我们来谈谈 NodeJ...
    99+
    2023-06-27
  • oracle恢复的时候,recover和restore的区别
    简单就是两句话restore 就是转储,物理文件上还原到一个时间点;recover 是借助redo log和archive log恢复。懂了吗 ...
    99+
    2022-10-18
  • Golang中Unicode与UTF-8有什么区别
    Golang中Unicode与UTF-8有什么区别,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Unicode 与 UTF-8...
    99+
    2022-10-19
  • golang中"var"与":="的区别解析
    Go语言里面定义变量有多种方式。 使用var关键字是Go最基本的定义变量方式,有时也会使用到:=来定义变量。 定义变量 // 定义一个名称为“variableName”,类型为"ty...
    99+
    2023-05-18
    go var :=区别 go var :=
  • golang中协程与线程的区别是什么
    golang中协程与线程的区别有”调度器“、”内存和性能“、”锁和同步“和”异常处理“四点:1、协程则是由 Go 语言运行时调度的,而线程是由操作系统内核调度的;2、协程在相同的堆栈空间内运行,而线程都需要独立的堆栈空间和上下文切换的开销;...
    99+
    2023-12-12
    Golang golang线程 Golang协程
  • 聊聊Python与Golang的区别有哪些
    Python是一种高级编程语言,它被广泛用于数据科学、计算机科学、人工智能和互联网开发等领域。而Golang是一种新型的编程语言,也被称为Go,由Google开发,它的设计目的是为了在多核和网络环境下提供更好的性能和可伸缩性。语言设计Pyt...
    99+
    2023-05-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作