产生 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")

}


RISEBY
浏览 82回答 1
1回答

九州编程

你是对的,你对此无能为力。os.Exit()例如,如果依赖项调用,您也不能。无论如何,将 goroutines 作为库启动通常是不好的做法,让客户端(库的用户)选择是否需要并发执行(goroutine),添加go关键字是微不足道的。当然也有例外。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go