此恢复有效:
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 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)
}
关于go - testing.M 在 golang 中恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29652530/