在golang测试M recover

在golang测试M recover,go,Go,此恢复工作: 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 Test

此恢复工作:

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)
}
为什么?? 我希望
func TestMain(m*testing.m)
中的代码可以恢复这里的
panic
。为什么不呢?在这种情况下,我只有
恐慌
,没有任何
恢复

完整代码:

package main

import (
    "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
命令。

这是因为测试是在单独的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)
}