在 Go 语言中,使用 recover
可以捕获和处理由 panic
引发的恐慌。并不是所有的 panic
都可以被 recover
捕获,以下是一些要点:
使用场景:只有在调用
recover
的时候,当前 goroutine 正处于 panic 状态,并且在同一个 goroutine 内部的 deferred 函数中调用时,才能捕获到 panic。defer 语句:通常情况下,你需要将
recover
放在一个通过defer
声明的函数内部。这样,当 panic 发生时,它能正确捕获。非捕获情况:
- 如果一个 goroutine 中产生了 panic,但没有执行到含有 recover 的 deferred 函数,则 panic 不会被捕获,程序会终止。
- 在主 goroutine 中,如果出现 panic 而没有 recover,会导致整个程序崩溃。
Panic 和 Recover 示例: “`go package main
import (
"fmt"
)
func risky() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from:", r)
}
}()
fmt.Println("About to cause a panic")
panic("something went wrong")
}
func main() {
risky()
fmt.Println("After risky call")
} “`
在上面的例子中,虽然 risky()
函数引发了 panic,但由于有适当的 defer 和 recover,所以程序能够恢复而不会完全崩溃。
总结来说,在 Go 中,通过合理使用 defer 和 recover,你可以处理许多由 panic 引起的错误,但需要注意使用场合和条件。
内容由零声教学AI助手提供,问题来源于学员提问