我试图了解如何从恐慌情况中恢复过来.通常,这样的事情会做:
if r := recover(); r != nil {
fmt.Println("Recovered in f", r)
}
Run Code Online (Sandbox Code Playgroud)
我能理解那些.但我看到的代码片段如下:
if r, ok := recover().(error); ok {
fmt.Println("Recovered in f", r)
}
Run Code Online (Sandbox Code Playgroud)
什么是.(错误)部分在做什么?
Von*_*onC 18
类型断言失败,导致运行时错误继续堆栈展开,好像没有任何中断它.
当您MyError为错误定义本地类型并且只想从该类型恢复时,这非常有用.
您可以在" 错误处理和转到 "中看到一个示例
客户端代码可以使用类型断言测试net.Error,然后将瞬态网络错误与永久网络错误区分开来.
例如,网络爬虫可能:
- 睡觉并在遇到临时错误时重试
- 否则就放弃了.
if nerr, ok := err.(net.Error); ok && nerr.Temporary() {
time.Sleep(1e9)
continue
}
if err != nil {
log.Fatal(err)
}
Run Code Online (Sandbox Code Playgroud)
如果你有几个要恢复类型的错误,你可以使用一个类型开关处于" Golang:从推迟回国 "
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
}
}()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5588 次 |
| 最近记录: |