面试题答案
一键面试在Go语言中,可以使用recover
来实现这种需求。以下是示例代码:
package main
import (
"fmt"
)
// 模拟内层函数
func innerFunction() {
panic("模拟内层函数发生panic")
}
// 模拟外层函数
func outerFunction() {
defer func() {
if r := recover(); r != nil {
// 捕获到panic并恢复
fmt.Printf("捕获到panic: %v\n", r)
// 这里可以处理和保留重要的中间状态
// 例如记录日志、保存部分计算结果等
}
}()
innerFunction()
// 即使内层函数发生panic,这里的后续逻辑也可以继续执行
fmt.Println("外层函数后续逻辑")
}
在上述代码中,outerFunction
使用defer
和recover
来捕获innerFunction
可能发生的panic
。当innerFunction
发生panic
时,recover
函数会捕获到这个panic
,并可以在if
语句块中处理和保留重要的中间状态,之后外层函数的后续逻辑可以继续执行。在实际应用中,if
语句块内可以进行更复杂的状态处理逻辑,比如记录错误日志、保存已完成的计算结果等。
你可以在main
函数中调用outerFunction
来测试这个逻辑:
func main() {
outerFunction()
fmt.Println("主函数继续执行")
}
运行这个程序,输出结果如下:
捕获到panic: 模拟内层函数发生panic
外层函数后续逻辑
主函数继续执行