广告
返回顶部
首页 > 资讯 > 后端开发 > GO >go goroutine 怎样进行错误处理
  • 466
分享到

go goroutine 怎样进行错误处理

2024-04-02 19:04:59 466人浏览 薄情痞子
摘要

目录前言 通过错误日志记录 利用 channel 传输 使用 sync/errgroup 总结 前言 在 Go 语言程序开发中,goroutine 的使用是比较频繁的,因此在日常编

前言

Go 语言程序开发中,goroutine 的使用是比较频繁的,因此在日常编码的时候 goroutine 里的错误处理,怎么做会比较好呢?

一般我们的业务代码如下:


func main() {
 var wg sync.WaitGroup
 wg.Add(2)
 go func() {
  //... 业务逻辑
  wg.Done()
 }()
 go func() {
  //... 业务逻辑
  wg.Done()
 }()
 wg.Wait()
}

在上面的代码中,我们运行了多个 goroutine,每个协程又是单独行动的,想要抛出 error 错误信息,也不怎么明智。

通过错误日志记录

常用的第一种方法:通过把错误记录写入到日志文件中,再结合相关的 logtail 进行采集和梳理。

但这又会引入新的问题,那就是调用错误日志的方法写的到处都是,代码结构也比较乱、不直观。

最重要的是无法针对 error 做特定的逻辑处理和流转。

利用 channel 传输

大家可能会想到 Go 的经典哲学:不要通过共享内存来通信,而是通过通信来实现内存共享(Do not communicate by sharing memory; instead, share memory by communicating)。

第二种方法:利用 channel 来传输多个 goroutine 中的 errors:


func main() {
 cherrors := make(chan error)
 wgDone := make(chan bool)

 var wg sync.WaitGroup
 wg.Add(2)
 go func() {
  //... 业务逻辑
  wg.Done()
 }()
 go func() {
  //... 业务逻辑
  err := returnErr()
  if err != nil {
   cherrors <- err
  }
  wg.Done()
 }()
 go func() {
  wg.Wait()
  close(wgDone)
 }()

 select {
 case <-wgDone:
  break
 case err := <-cherrors:
  close(cherrors)
  fmt.Println(err)
 }

 time.Sleep(time.Second)
}

func returnErr() error {
 return errors.New("出错啦。。我是错误信息")
}

虽然使用 channel 后已经方便了不少,但编写 channel 还要关心一些非业务向的逻辑。

使用 sync/errgroup

第三种方法,就是使用官方提供的 golang.org/x/sync/errgroup 标准库:


type Group
    func WithContext(ctx context.Context) (*Group, context.Context)
    func (g *Group) Go(f func() error)
    func (g *Group) Wait() error
  • Go:启动一个协程,在新的 goroutine 中调用给定的函数。
  • Wait:等待协程结束,直到 Go 方法中的所有函数调用都返回,然后返回其中第一个非零错误(如果有错误的话)。

结合其特性能够非常便捷的针对多 goroutine 进行错误处理:


func main() {
 group := new(errgroup.Group)

 nums := []int{-1, 0, 1}
 for _, num := range nums {
  num := num
  group.Go(func() error {
   res, err := output(num)
   fmt.Println(res)
   return err
  })
 }

 if err := group.Wait(); err != nil {
  fmt.Println("Get errors: ", err)
 } else {
  fmt.Println("Get all num successfully!")
 }
}

func output(num int) (int, error) {
 if num < 0 {
  return 0, errors.New("math: square root error!")
 }
 return num, nil
}

每启动一个新的 goroutine 都直接使用 Group.Go 方法,在等待和错误处理上使用 Group.Wait 方法。

这种方法进行错误处理的好处是不需要关注非业务逻辑的控制代码,比较简洁明了。

总结

在 Go 语言中,goroutine 是一种常用的方法,为此我们需要更了解 goroutine 的一系列相关知识,像是 context、error处理等

在团队开发中,统一一定的规范,这样的代码阅读起来就会比较明朗,一些隐藏很深的 Bug 也会减少很多。

到此这篇关于go goroutine 怎样进行错误处理的文章就介绍到这了,更多相关go goroutine 错误处理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: go goroutine 怎样进行错误处理

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

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

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

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

下载Word文档
猜你喜欢
  • go goroutine 怎样进行错误处理
    目录前言 通过错误日志记录 利用 channel 传输 使用 sync/errgroup 总结 前言 在 Go 语言程序开发中,goroutine 的使用是比较频繁的,因此在日常编...
    99+
    2022-11-12
  • Golang中怎么对错误进行处理
    这期内容当中小编将会给大家带来有关Golang中怎么对错误进行处理,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先介绍几种常见的创建错误的方法基于字符串的错误err1&...
    99+
    2022-10-19
  • Nodejs中怎么对错误进行处理
    今天就跟大家聊聊有关Nodejs中怎么对错误进行处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。假设我们有以下代码const net&n...
    99+
    2022-10-19
  • golang如何进行错误处理
    这篇“golang如何进行错误处理”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“golang如何进行错误处理”文章吧。Gol...
    99+
    2023-07-04
  • vbScript中如何进行错误处理
    这篇文章将为大家详细讲解有关vbScript中如何进行错误处理,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。vbscript中,错误处理使用on error resume next来完成,如果在你的代码里...
    99+
    2023-06-08
  • Go语言中怎么有效处理错误
    今天就跟大家聊聊有关Go语言中怎么有效处理错误,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、简介Go语言受到诟病最多的一项就是其错误处理机制。如...
    99+
    2022-10-19
  • PHP中PDO如何进行错误处理
    这篇文章给大家分享的是有关PHP中PDO如何进行错误处理的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在之前的学习中我们已经学会出来了通过PDO获取查询结果,那接下来就要学习一下PDO的错误处理, 在 PDO 中...
    99+
    2023-06-25
  • c++运行时错误怎么处理
    处理 C++ 运行时错误的一般方法包括:1. 异常处理:使用 try-catch 块来捕获可能抛出的异常,并在 catch 块中处理...
    99+
    2023-10-08
    c++
  • 通过golang进行Select Channels Go并发式编程的错误处理方法
    在Go并发式编程中,可以使用select语句来同时监听多个通道的数据流动,并根据不同的情况进行处理。当一个或多个通道有数据可读时,s...
    99+
    2023-10-08
    Golang
  • thinkphp5中怎么进行错误处理的相关信息
    本篇内容介绍了“thinkphp5中怎么进行错误处理的相关信息”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!错误处理机制ThinkPHP5提...
    99+
    2023-07-05
  • JavaScript 错误处理的解决过程是怎样的
    本篇文章为大家展示了JavaScript 错误处理的解决过程是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是编程中的错误我们的开发过程中并不总是一帆风顺...
    99+
    2022-10-19
  • 怎样处理SAP HANA Web-Based Development Workbench的403 Forbidden错误
    这期内容当中小编将会给大家带来有关怎样处理SAP HANA Web-Based Development Workbench的403 Forbidden错误,文章内容丰富且以专业的角度为大家分析和叙述,阅读完...
    99+
    2022-10-19
  • Go语言中怎么对栈进行处理
    本篇文章为大家展示了Go语言中怎么对栈进行处理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、线程栈(thread stacks)介绍在我们研究Go的栈处理方式之...
    99+
    2022-10-19
  • python在怎样进行函数文件处理
    python在怎样进行函数文件处理,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。文档处理# f=open('a.txt','r+'...
    99+
    2023-06-04
  • Ant Design Pro 5 网络请求和错误处理是怎样的
    本篇文章为大家展示了Ant Design Pro 5 网络请求和错误处理是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Ant Design Pro 5 的网络请求有点复杂,只看文档不阅读源码...
    99+
    2023-06-26
  • 使用Raygun对Node.js应用进行错误处理的方法
    用我们的 raygun4node 包,能提供一种把您的Node.js错误发送给Raygun的便利办法. 它可以很容仪的使用 npm 安装: npm install raygun 其能给您提供一...
    99+
    2022-06-04
    错误 方法 Raygun
  • Golang开发建议:如何进行有效的错误处理
    Golang作为一种现代化的编程语言,以其高效、简洁、安全等特点受到了广泛的关注和使用。错误处理是任何程序开发中都无法回避的部分,而Golang又提供了一套强大的错误处理机制。本文将介绍如何在Golang中进行有效的错误处理,以帮助开发者编...
    99+
    2023-11-22
    错误处理 (Error handling) Golang开发 (Golang development) 有效的 (eff
  • PHP如何在Yii框架中进行错误和异常处理
    这篇文章主要讲解了“PHP如何在Yii框架中进行错误和异常处理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP如何在Yii框架中进行错误和异常处理”吧!Yii已经默认已经在CApplic...
    99+
    2023-06-20
  • Rust使用kind进行异常处理(错误的分类与传递)
    目录前言1.1、panic! 宏的使用1.2、通过 Powershell命令行分析错误原因2、可恢复的错误2.1、Rustlt<T,E>枚举类的使用2.2、Result ...
    99+
    2022-11-13
  • C++开发建议:如何进行C++代码优雅的错误处理
    C++开发建议:如何进行C++代码优雅的错误处理引言:在C++开发中,错误处理是一项重要的技术,它涉及如何识别错误、处理异常情况以及保证程序的正常运行。良好的错误处理机制可以提高代码的可维护性和可靠性,而糟糕的错误处理可能导致程序崩溃、资源...
    99+
    2023-11-22
    错误处理 C++编程 优雅处理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作