我想从一个函数返回错误,如果它出现紧急情况(在Go中):
func getReport(filename string) (rep report, err error) { rep.data = make(map[string]float64) defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) err, _ = r.(error) return nil, err } }() panic("Report format not recognized.") // rest of the getReport function, which can try to out-of-bound-access a slice ... }
我似乎误解了恐慌和延缓的概念。有人可以启发我吗?
在延迟函数中,您可以更改返回的参数,但不能返回新的参数集。因此,只需对现有内容进行简单的更改即可使其正常运行。
您编写的内容还有另一个问题,即您对a表示惊慌,string但期望error类型断言中出现a。
string
error
这是针对两者的解决方法(播放)
defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) // find out exactly what the error was and set err switch x := r.(type) { case string: err = errors.New(x) case error: err = x default: err = errors.New("Unknown panic") } // invalidate rep rep = nil // return the modified err and rep } }()