go中异常处理流程

这篇具有很好参考价值的文章主要介绍了go中异常处理流程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在 Go 语言中,panicrecoverdefer 是用于处理异常情况的关键字。它们通常一起使用来实现对程序错误的处理和恢复。

1. defer 语句

defer 用于在函数返回之前执行一段代码。被 defer 修饰的语句或函数会在包含 defer 的函数执行完毕后执行。defer 常用于资源清理、释放锁、关闭文件等操作。

func example() {
    defer fmt.Println("This will be executed last")
    fmt.Println("This will be executed first")
}

2. panic 和 recover

  • panic 用于引发运行时错误,导致程序崩溃。
  • recover 用于捕获 panic 引发的错误,并进行处理。
func example() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("Recovered from panic:", err)
        }
    }()

    panic("This will cause a panic")
}

3. 示例

  1. 当程序执行到 panic 语句时,它会立即停止当前函数的执行,并开始沿调用堆栈向上执行所有的 defer 语句。
  2. 执行 defer 语句时,将其推迟的函数或语句加入到一个栈中,但并不立即执行。
  3. 当所有的 defer 语句都被执行完毕后,程序会终止当前的函数执行,然后开始执行上一层函数的 defer 语句,以此类推。
  4. 如果在 defer 语句执行的过程中发生了 panic,则 panic 会被引发,但是在引发 panic 之前,会先执行该层级的 defer 语句。
  5. 如果有 recover 函数被调用,它会停止 panic 的传播,并返回传递给 panic 的值。

在 Go 中,一个协程(goroutine)出现 panic 不会直接影响其他协程的正常执行。Go 语言的设计目标之一是实现轻量级的并发,保持协程的独立性。因此,一个协程的 panic 不会波及到其他协程。

当一个协程发生 panic 时,通常会触发一系列的 defer 函数的执行,这提供了一种清理资源或记录日志等操作的机制。然后,Go 运行时系统会停止当前协程的执行,但不会影响其他正在运行的协程。

其他协程会继续执行,而不受 panic 影响。这是由于 Go 使用了处理异常的机制,而不是像传统的错误处理机制那样需要在每个函数中检查错误。在 Go 中,panic 主要用于表示程序遇到无法继续执行的错误情况。

下面是一个简单的例子,演示了一个协程的 panic 不会影响其他协程:

package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	var wg sync.WaitGroup

	wg.Add(1)
	go func() {
		defer wg.Done()
		panicExample()
	}()

	// 启动另一个协程
	wg.Add(1)
	go func() {
		defer wg.Done()
		fmt.Println("Another goroutine is running.")
	}()

	// 等待所有协程结束
	wg.Wait()
}

func panicExample() {
	defer func() {
		if r := recover(); r != nil {
			fmt.Println("Recovered from panic:", r)
		}
	}()

	fmt.Println("Start of panicExample")
	time.Sleep(1 * time.Second)
	panic("Something went wrong!")
	fmt.Println("End of panicExample") // 不会执行到这里
}

在这个例子中,panicExample 函数中的 panic 不会影响另一个协程的正常执行。虽然一个协程中发生了 panic,但其他协程仍然可以继续执行。

4. 总结

在Go中,runtime包是负责处理Go运行时(runtime)的细节,包括垃圾回收、协程调度等。当出现panic时,runtime包会负责处理这些异常情况。

当程序中出现panic时,Go运行时会按照以下步骤进行处理:

  1. 异常的传播:当一个函数发生panic时,该函数会立即停止执行,并将panic传播到调用它的函数。这个过程会一直向上传播,直到被捕获或程序终止。
  2. 栈的展开(Unwinding):在panic发生时,Go运行时会开始展开调用栈(stack unwinding)。这意味着它会逆序执行当前调用栈中的函数,直到找到一个能够处理panic的函数。
  3. 恢复(Recovery):在展开调用栈的过程中,Go运行时会寻找一个适当的recover函数来捕获并处理panicrecover函数是在当前协程的上下文中执行的,用于捕获并处理当前协程中的panic。如果找到了一个recover函数,并且它成功处理了panic(即没有再次触发panic),则程序会从发生panic的位置开始继续执行。
  4. 如果没有找到适当的recover函数来处理panic,程序将终止执行,并打印出相应的错误信息。

在处理panic时,需要注意以下几点:

  • panic通常表示程序中存在无法恢复的错误,因此应该尽量避免在正常的程序逻辑中使用panic
  • panicrecover是用于处理程序中的异常情况,而不是用于控制程序的正常流程。
  • recover函数只能在协程(goroutine)的执行过程中使用,并且只能捕获当前协程中的panic
  • 当一个协程出现panic时,其它协程不会受到影响,会继续独立执行。

go中异常处理流程

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
腾讯云开发者社区:孟斯特文章来源地址https://www.toymoban.com/news/detail-746356.html


到了这里,关于go中异常处理流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Go中Panic and Recover

    什么是Panic? 在 Go 程序中处理异常情况的惯用方法是使用errors.。errors足以应对程序中出现的大多数异常情况。 **但有些情况下,程序在出现异常情况后无法继续执行。在这种情况下,我们使用 panic 提前终止程序。当函数遇到恐慌时,其执行将停止,所有延迟的函数都会被执

    2024年02月06日
    浏览(21)
  • go中异常处理流程

    在 Go 语言中, panic 、 recover 和 defer 是用于处理异常情况的。它们通常一起使用来实现对程序错误的处理和恢复。 defer 用于在函数返回之前执行一段代码。被 defer 修饰的语句或函数会在包含 defer 的函数执行完毕后执行。 defer 常用于资源清理、释放锁、关闭文件等操作

    2024年02月05日
    浏览(29)
  • 如何理解Go言中的Context?

    目前看过除了《go语言程序设计》以外最好的教程:https://www.practical-go-lessons.com 原文:https://www.practical-go-lessons.com/chap-37-context 你将在本章中学到什么? 1.什么是上下文? 2.什么是链表? 3.如何使用上下文包? 涵盖的技术概念 Context derivation Linked list Context key-value pair Cancella

    2024年02月08日
    浏览(25)
  • GO——recover

    定义 panic 改变程序控制流 立即停止当前函数剩余代码,调用defer 只会执行当前协程的defer recover 可以终止panic造成的程序崩溃 只能在defer中发挥作用 输出

    2024年01月25日
    浏览(17)
  • Go的异常处理

    在Go中不支持传统的try…catch…finally这种处理,在Go中引入了defer、panic、recover处理方式,通过抛出一个panic异常,然后在defer中通过recover捕获这个异常,最后正常处理。 Go程序中,也支持自定义异常处理,使用errors.New和panic内置函数。其中: errors.New(“错误说明”),返回一个

    2024年02月21日
    浏览(24)
  • Go语言入门10(异常处理)

    ​如果出现了panic异常,那么会停止当前函数的运行,然后会找recover()方法,如果没有的话,就会报错退出程序,如果有就会执行recover的方法体中的方法 ​我们可以使用defer延迟处理函数来捕获panic异常,用recover()来从错误场景中恢复,必须的在defer修饰的方法中使用,不然不

    2023年04月23日
    浏览(21)
  • Go中的异常处理(基础)

    主要掌握 一下几个方面: 掌握error接口 掌握defer延迟 掌握panic及recover error是指程序中出现不正常的情况,从而导致程序无法正常运行; go中为错误的类型提供了简单的错误处理机制 go中error的源码: 可以看到接口中定义了Error方法,我们可以实现这个方法已实现error接口;

    2024年02月12日
    浏览(25)
  • go语言(五)----defer

    1、defer的词义:“延迟”,“推迟” 在go语言中,defer来延迟一个函数或者方法的执行 1.defer函数或方法:一个函数或方法的执行被延迟了 2.defer的用法: A:对象.close(),临时文件的删除。。。 文件.open() defer close() 读或写 B:go语言中关于异常的处理,使用panic()和reco

    2024年01月20日
    浏览(23)
  • Go的Defer简介

    什么是延期? Defer 语句用于在存在 defer 语句的周围函数返回之前执行函数调用 。该定义可能看起来很复杂,但通过示例就很容易理解。 例子 Run in playground 上面是一个简单的程序,用于查找给定切片的最大数量。该 largest 函数接受一个int切片作为参数并打印该切片的最大数

    2024年02月06日
    浏览(19)
  • 【C++】异常处理 ① ( 异常概念引入 | 抛出异常语法 | 捕获异常语法 | 异常捕获流程 | 异常处理代码示例 )

    异常是一种 特殊的程序流控制机制 , 用于处理程序中可能出现的错误或异常情况 ; 当程序执行错误时 , 由 throw 抛出异常 , 并即跳转到相应的异常处理程序中 ; 如果没有适当的异常处理程序处理该异常 , 程序会崩溃终止 ; 异常与函数对比 : 函数 是一种 以 栈结构 展开的

    2024年02月04日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包