testing.M recover in golang

huangapple go评论112阅读模式
英文:

testing.M recover in golang

问题

这是一个恢复(recover)工作的例子:

  1. func TestSomeTest(t *testing.T) {
  2. defer func() {
  3. r := recover()
  4. fmt.Println("recovery")
  5. fmt.Println(r)
  6. }()
  7. panic("panic here")
  8. }

但是这个例子不起作用:

  1. func TestSomeTest(t *testing.T) {
  2. panic("panic here")
  3. }
  4. func TestMain(m *testing.M) {
  5. defer func() {
  6. r := recover()
  7. fmt.Println("recovery")
  8. fmt.Println(r)
  9. }()
  10. ret := m.Run()
  11. os.Exit(ret)
  12. }

为什么呢?我期望panic here会被func TestMain(m *testing.M)中的代码恢复(recover)。为什么没有呢?在这种情况下,我只有panic而没有任何recovery

完整代码:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "testing"
  6. )
  7. func TestSomeTest(t *testing.T) {
  8. // defer func() {
  9. // r := recover()
  10. // fmt.Println("recovery")
  11. // fmt.Println(r)
  12. // }()
  13. panic("panic here")
  14. }
  15. func TestMain(m *testing.M) {
  16. defer func() {
  17. r := recover()
  18. fmt.Println("recovery")
  19. fmt.Println(r)
  20. }()
  21. ret := m.Run()
  22. os.Exit(ret)
  23. }

我使用go test命令来运行这段代码。

英文:

This recovery works:

  1. func TestSomeTest(t *testing.T) {
  2. defer func() {
  3. r := recover()
  4. fmt.Println("recovery")
  5. fmt.Println(r)
  6. }()
  7. panic("panic here")
  8. }

But this does not:

  1. func TestSomeTest(t *testing.T) {
  2. panic("panic here")
  3. }
  4. func TestMain(m *testing.M) {
  5. defer func() {
  6. r := recover()
  7. fmt.Println("recovery")
  8. fmt.Println(r)
  9. }()
  10. ret := m.Run()
  11. os.Exit(ret)
  12. }

Why?
I expect that panic here will be recovered by code in func TestMain(m *testing.M). Why not? I just have panic without any recovery in this case.

Full code:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "testing"
  6. )
  7. func TestSomeTest(t *testing.T) {
  8. // defer func() {
  9. // r := recover()
  10. // fmt.Println("recovery")
  11. // fmt.Println(r)
  12. // }()
  13. panic("panic here")
  14. }
  15. func TestMain(m *testing.M) {
  16. defer func() {
  17. r := recover()
  18. fmt.Println("recovery")
  19. fmt.Println(r)
  20. }()
  21. ret := m.Run()
  22. os.Exit(ret)
  23. }

To run this code I used go test command.

答案1

得分: 8

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

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

  1. func TestSomeTest(t *testing.T) {
  2. defer func() {
  3. r := recover()
  4. fmt.Println("recovery")
  5. fmt.Println(r)
  6. }()
  7. go func() {
  8. // 不会恢复
  9. panic("panic here")
  10. }()
  11. time.Sleep(time.Second)
  12. }
英文:

It's because the tests are run in separate goroutines.

It's like if your fist example sent off a goroutine, which can't be recovered.

  1. func TestSomeTest(t *testing.T) {
  2. defer func() {
  3. r := recover()
  4. fmt.Println("recovery")
  5. fmt.Println(r)
  6. }()
  7. go func() {
  8. // won't recover
  9. panic("panic here")
  10. }()
  11. time.Sleep(time.Second)
  12. }

huangapple
  • 本文由 发表于 2015年4月15日 22:08:46
  • 转载请务必保留本文链接:https://go.coder-hub.com/29652530.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定