MST

星途 面试题库

面试题:Rust中如何优雅地处理嵌套函数调用中的panic恢复

假设存在一个复杂的函数调用链,其中嵌套了多层函数调用。当某个内层函数发生panic时,外层函数如何在不丢失重要中间状态的前提下,实现恢复并继续执行后续逻辑?请用代码示例说明你采用的策略。
20.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

在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使用deferrecover来捕获innerFunction可能发生的panic。当innerFunction发生panic时,recover函数会捕获到这个panic,并可以在if语句块中处理和保留重要的中间状态,之后外层函数的后续逻辑可以继续执行。在实际应用中,if语句块内可以进行更复杂的状态处理逻辑,比如记录错误日志、保存已完成的计算结果等。

你可以在main函数中调用outerFunction来测试这个逻辑:

func main() {
    outerFunction()
    fmt.Println("主函数继续执行")
}

运行这个程序,输出结果如下:

捕获到panic: 模拟内层函数发生panic
外层函数后续逻辑
主函数继续执行