panic的作用:停止当前函数执行,一直向上返回,执行每一层的defer,直到遇到recover,panic被recover处理;如果没有遇到recover,则panic会导致程序退出。
recover的作用:recover仅在defer调用中使用,用于获取panic的值并进行处理,如果无法处理,则recover可以重新panic。
panic&recover示例1:
func tryRecover() {
defer func() {
r := recover() // 获取panic的值
if err, ok := r.(error); ok {
fmt.Println("Error occurred:", err)
} else {
panic(r)
}
}()
panic(errors.New("this is an error"))
}
func main() {
tryRecover() // Error occurred: this is an error
}
panic&recover示例2:
func tryRecover() {
defer func() {
r := recover() // 获取panic的值
if err, ok := r.(error); ok {
fmt.Println("Error occurred:", err)
} else {
panic(r)
}
}()
b := 0
a := 5 / b
fmt.Println(a)
}
func main() {
tryRecover() // Error occurred: runtime error: integer divide by zero
}
panic&recover示例3:
func tryRecover() {
defer func() {
r := recover() // 获取panic的值
if err, ok := r.(error); ok {
fmt.Println("Error occurred:", err)
} else {
panic(fmt.Sprintf("I don't know what to do: %v", r))
}
}()
panic(123)
}
func main() {
tryRecover()
// panic: 123 [recovered]
// panic: I don't know what to do: 123
}