登录
首页 >  Golang >  Go问答

goroutine 引发恐慌的库发生异常

来源:stackoverflow

时间:2024-03-22 14:09:35 344浏览 收藏

当导入的库生成一个可能发生恐慌的 goroutine 时,开发人员无法阻止程序退出。即使在主程序中使用延迟恢复也无济于事,因为库中的 goroutine 无法被捕获。因此,在选择依赖项时必须谨慎,避免出现此类问题。

问题内容

如果导入的库生成一个可能会出现恐慌的 goroutine 怎么办?在这种情况下,开发人员无法阻止程序退出。

就像这段代码一样,调用带有延迟恢复的坏库并没有帮助,因为该库正在生成一个发生恐慌的 goroutine,并且它无法被 main 的恢复捕获。

我的理解是否正确,唯一的补救措施是在为项目选择依赖项时非常小心,并希望作者不要做类似的事情?

package main

import (
    "fmt"
    "time"
)

func main() {
    defer func() {
        r := recover()
        if r != nil {
            fmt.Println("panic caught")
        }
    }()

    badLibrary()
}

func badLibrary() {
    go recklessFunction()
    time.Sleep(time.Second)
}

func recklessFunction() {
    panic("something went wrong")
}

正确答案


你是对的,对此你无能为力。例如,如果依赖项调用 os.Exit(),您也不能这样做。

无论如何,将 goroutine 作为库启动通常是不好的做法,让客户端(库的用户)选择是否需要并发执行(goroutine),添加 go 关键字是微不足道的。当然也有例外。

以上就是《goroutine 引发恐慌的库发生异常》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>