2016-08-18 85 views
0

我有以下代码片段从索引中恢复出范围恐慌主和测试从恐慌中恢复之间的区别?

Playground,还粘贴了以下

错误的是nil以等同的试验情况下,从主但不是nil时调用。有什么不同 ?

type Foo struct { 
    Is []int 
} 

func main() { 
    fp := &Foo{} 
    if err := fp.Panic(); err != nil { 
     fmt.Errorf("Error: %v", err) 
    } 
    fmt.Println("ok") 
} 

func (fp *Foo) Panic() (err error) { 
    defer PanicRecovery(&err) 
    fp.Is[0] = 5 
    return nil 
} 

func PanicRecovery(err *error) { 

     if r := recover(); r != nil { 
       if _, ok := r.(runtime.Error); ok { 
      //fmt.Println("Panicing") 
        *err = r.(error) //panic(r) 
       } else { 
      *err = r.(error) 
     } 
    } 
} 

测试用例:

func TestPanic(t *testing.T) { 
    fp := &Foo{} 
    if err := fp.Panic(); err != nil { 
     t.Errorf("Panic: %v", err) 
    } 
} 

回答

1

更改您的主要功能从嵌套行:

fmt.Errorf("Error: %v", err) 

要:

fmt.Printf("Error: %v", err) 

注意,"Errorf"功能没有按”打印任何东西标准输出。它通过格式化您提供的文本和参数来创建错误,并简单地返回该错误。你真正想要的是"fmt.Printf"