ToB企服应用市场:ToB评测及商务社交产业平台

标题: go中异常处理流程 [打印本页]

作者: 种地    时间: 2023-12-30 00:49
标题: go中异常处理流程
在 Go 语言中,panic、recover 和 defer 是用于处理异常情况的关键字。它们通常一起使用来实现对程序错误的处理和恢复。
1. defer 语句

defer 用于在函数返回之前执行一段代码。被 defer 修饰的语句或函数会在包含 defer 的函数执行完毕后执行。defer 常用于资源清理、释放锁、关闭文件等操作。
  1. func example() {
  2.     defer fmt.Println("This will be executed last")
  3.     fmt.Println("This will be executed first")
  4. }
复制代码
2. panic 和 recover

  1. func example() {
  2.     defer func() {
  3.         if err := recover(); err != nil {
  4.             fmt.Println("Recovered from panic:", err)
  5.         }
  6.     }()
  7.     panic("This will cause a panic")
  8. }
复制代码
3. 示例

在 Go 中,一个协程(goroutine)出现 panic 不会直接影响其他协程的正常执行。Go 语言的设计目标之一是实现轻量级的并发,保持协程的独立性。因此,一个协程的 panic 不会波及到其他协程。
当一个协程发生 panic 时,通常会触发一系列的 defer 函数的执行,这提供了一种清理资源或记录日志等操作的机制。然后,Go 运行时系统会停止当前协程的执行,但不会影响其他正在运行的协程。
其他协程会继续执行,而不受 panic 影响。这是由于 Go 使用了处理异常的机制,而不是像传统的错误处理机制那样需要在每个函数中检查错误。在 Go 中,panic 主要用于表示程序遇到无法继续执行的错误情况。
下面是一个简单的例子,演示了一个协程的 panic 不会影响其他协程:
  1. package main
  2. import (
  3.         "fmt"
  4.         "sync"
  5.         "time"
  6. )
  7. func main() {
  8.         var wg sync.WaitGroup
  9.         wg.Add(1)
  10.         go func() {
  11.                 defer wg.Done()
  12.                 panicExample()
  13.         }()
  14.         // 启动另一个协程
  15.         wg.Add(1)
  16.         go func() {
  17.                 defer wg.Done()
  18.                 fmt.Println("Another goroutine is running.")
  19.         }()
  20.         // 等待所有协程结束
  21.         wg.Wait()
  22. }
  23. func panicExample() {
  24.         defer func() {
  25.                 if r := recover(); r != nil {
  26.                         fmt.Println("Recovered from panic:", r)
  27.                 }
  28.         }()
  29.         fmt.Println("Start of panicExample")
  30.         time.Sleep(1 * time.Second)
  31.         panic("Something went wrong!")
  32.         fmt.Println("End of panicExample") // 不会执行到这里
  33. }
复制代码
在这个例子中,panicExample 函数中的 panic 不会影响另一个协程的正常执行。虽然一个协程中发生了 panic,但其他协程仍然可以继续执行。
4. 总结

在Go中,runtime包是负责处理Go运行时(runtime)的细节,包括垃圾回收、协程调度等。当出现panic时,runtime包会负责处理这些异常情况。
当程序中出现panic时,Go运行时会按照以下步骤进行处理:
在处理panic时,需要注意以下几点:
  
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
腾讯云开发者社区:孟斯特

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4