为了账号安全,请及时绑定邮箱和手机立即绑定

testing.M 在 golang 中恢复

testing.M 在 golang 中恢复

Go
慕姐4208626 2021-09-27 21:09:10
此恢复工作:func TestSomeTest(t *testing.T) {    defer func() {        r := recover()        fmt.Println("recovery")        fmt.Println(r)    }()    panic("panic here")}但这不会:func TestSomeTest(t *testing.T) {    panic("panic here")}func TestMain(m *testing.M) {    defer func() {        r := recover()        fmt.Println("recovery")        fmt.Println(r)    }()    ret := m.Run()    os.Exit(ret)}为什么?我希望这panic here将通过func TestMain(m *testing.M). 为什么不?在这种情况下,我panic没有任何recovery。完整代码:package mainimport (    "fmt"    "os"    "testing")func TestSomeTest(t *testing.T) {    // defer func() {    //  r := recover()    //  fmt.Println("recovery")    //  fmt.Println(r)    // }()    panic("panic here")}func TestMain(m *testing.M) {    defer func() {        r := recover()        fmt.Println("recovery")        fmt.Println(r)    }()    ret := m.Run()    os.Exit(ret)}要运行此代码,我使用了go test命令。
查看完整描述

1 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

这是因为测试是在单独的 goroutine 中运行的。


就像你的第一个例子发送了一个无法恢复的 goroutine。


func TestSomeTest(t *testing.T) {

    defer func() {

        r := recover()

        fmt.Println("recovery")

        fmt.Println(r)

    }()


    go func() {

        // won't recover

        panic("panic here")

    }()

    time.Sleep(time.Second)

}


查看完整回答
反对 回复 2021-09-27
  • 1 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信