Wyx97 2023-04-11 09:33 采纳率: 33.3%
浏览 28
已结题

goroutine异常导致程序崩溃

goroutine异常问题
刚从java转go,有些地方的使用不是很清楚,请教个问题 golang中接口创建了3个子线程分别请求数据,做了defer recover()的异常捕捉机制,但程序任然会异常崩溃,日志信息如下:

img

代码逻辑如下图,子线程里面是个http请求数据的过程

img


有没有优化的方案,能避免出现这种goroutine的异常问题

  • 写回答

2条回答 默认 最新

  • 「已注销」 2023-04-11 15:17
    关注

    以下内容部分参考ChatGPT模型:


    你好,关于你的问题,我认为可能是你的子线程抛出了异常但没有被及时捕获,导致程序崩溃。具体解决思路如下:

    1. 确保所有子线程的异常都被捕获并处理。可以在每个子线程中使用recover()来捕获异常,并将异常信息通过通道传递给主线程。

    2. 在主线程中使用select语句来等待所有子线程的结果,并处理异常信息。如果发现有子线程抛出异常,则在主线程中进行相应的处理,例如打印日志或发送警报。

    3. 确保所有子线程在处理完异常后能够正常退出。可以在每个子线程的defer语句中添加相应的清理操作,例如关闭文件句柄或释放资源。

    下面是一个示例代码,其中使用了三个子线程来请求数据,并将结果通过通道传递给主线程。每个子线程在处理异常后都会将异常信息传递给主线程,并在defer语句中进行清理操作。主线程在等待所有子线程的结果时会处理异常信息,并在所有子线程退出后进行最终的清理操作。

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        resultChan := make(chan int)
        errorChan := make(chan error)
        defer close(resultChan)
        defer close(errorChan)
    
        // 启动三个子线程
        for i := 0; i < 3; i++ {
            go func() {
                defer func() {
                    if err := recover(); err != nil {
                        errorChan <- fmt.Errorf("goroutine error: %v", err)
                    }
                    // 清理操作
                }()
    
                // 请求数据
                data, err := requestData()
                if err != nil {
                    panic(err)
                }
                resultChan <- data
            }()
        }
    
        // 等待所有子线程的结果
        var results []int
        for i := 0; i < 3; i++ {
            select {
            case data := <-resultChan:
                results = append(results, data)
            case err := <-errorChan:
                fmt.Println(err)
            }
        }
    
        // 处理结果
        fmt.Println(results)
    
        // 最终清理操作
    }
    
    func requestData() (int, error) {
        // 请求数据
        return 0, nil
    }
    

    希望以上解决思路能够对你有所帮助。如果还有不清楚的地方,请随时提出。


    如果我的建议对您有帮助、请点击采纳、祝您生活愉快

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月20日
  • 已采纳回答 4月12日
  • 创建了问题 4月11日

悬赏问题

  • ¥15 目详情-五一模拟赛详情页
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line