我在试着理解如何从恐慌中恢复过来。通常,像这样的代码就可以了:
if r := recover(); r != nil {
fmt.Println("Recovered in f", r)
}这些我都能理解。但我见过如下代码片段:
if r, ok := recover().(error); ok {
fmt.Println("Recovered in f", r)
}.(error)部分在做什么?
发布于 2014-09-03 15:44:18
它是一个检查error recovered是否属于某个类型的。
如果类型断言失败,则会导致运行时错误,从而继续堆栈展开,就好像没有任何东西中断它一样。
当您为error定义本地MyError类型,并且只想从该类型恢复时,这将非常有用。
你可以在"Error handling and Go“中看到一个例子。
客户端代码可以使用类型断言测试net.Error,然后区分暂时的网络错误和永久性的网络错误。
例如,web爬虫可能会:
if nerr, ok := err.(net.Error); ok && nerr.Temporary() {
time.Sleep(1e9)
continue
}
if err != nil {
log.Fatal(err)
}如果您有几种想要恢复的错误类型,您可以使用类型开关is in "Golang: returning from defer“
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:
// Fallback err (per specs, error strings should be lowercase w/o punctuation
err = errors.New("unknown panic")
}
// invalidate rep
rep = nil
// return the modified err and rep
}
}()https://stackoverflow.com/questions/25638842
复制相似问题