我正在努力了解如何从恐慌情况中恢复过来。通常,这样的事情会做:
if r := recover(); r != nil {
fmt.Println("Recovered in f", r)
}
我能理解那些。但我已经看到了如下代码片段:
if r, ok := recover().(error); ok {
fmt.Println("Recovered in f", r)
}
什么是。(错误)部分在做什么?
答案 0 :(得分:17)
type assertion 会检查error recovered是否属于某种类型。
类型断言失败,导致运行时错误继续堆栈展开,好像没有任何东西中断它。
当您为错误定义本地MyError
类型并且只想从该类型中恢复时,这非常有用。
您可以在" Error handling and Go"
中查看示例客户端代码可以测试带有类型断言的net.Error,然后将瞬态网络错误与永久网络错误区分开来。
例如,网络抓取工具可能:
- 睡眠并在遇到临时错误时重试
- 然后放弃。
if nerr, ok := err.(net.Error); ok && nerr.Temporary() {
time.Sleep(1e9)
continue
}
if err != nil {
log.Fatal(err)
}
如果您要恢复几种类型的错误,可以使用类型开关,并在#34; 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
}
}()