我有以下片段从索引超出范围的恐慌中恢复
Playground,也粘贴在
下面当从main调用时,错误为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)
}
}
答案 0 :(得分:1)
更改主函数的嵌套行:
fmt.Errorf("Error: %v", err)
要:
fmt.Printf("Error: %v", err)
请注意"Errorf"函数不会向stdout打印任何内容。它通过格式化您提供的文本和参数来创建错误,并简单地返回该错误。你真正想要的是"fmt.Printf"。