MST

星途 面试题库

面试题:Go中Panic与Recover在复杂函数调用链中的应用

假设有一个多层函数调用的场景,函数A调用函数B,函数B调用函数C,在函数C中可能会因为某些条件触发panic。请描述如何在函数A中通过recover捕获函数C触发的panic,并对捕获到的信息进行合适处理。请给出具体的代码示例,并说明在多层调用链中处理panic和recover时需要注意哪些问题。
47.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

代码示例(以Go语言为例)

package main

import (
    "fmt"
)

func C() {
    panic("函数C触发了panic")
}

func B() {
    C()
}

func A() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Printf("在函数A中捕获到panic: %v\n", r)
            // 在这里进行合适的处理,例如记录日志、返回特定错误值等
        }
    }()
    B()
}

func main() {
    A()
    fmt.Println("程序继续执行")
}

多层调用链中处理panic和recover时的注意事项

  1. defer的位置:defer语句必须在可能触发panic的函数调用之前定义,否则无法捕获到panic。如上述代码中,defer在调用B()之前定义。
  2. 作用域问题:recover只能在defer函数中有效,并且只能捕获当前goroutine中触发的panic。如果在不同的goroutine中触发panic,当前goroutine中的recover无法捕获。
  3. panic传递:如果在defer函数中没有使用recover捕获panic,panic会继续向上层调用链传递,直到程序崩溃。所以确保在合适的层次进行捕获处理。
  4. 错误处理:捕获到panic后,需要进行合适的错误处理,比如记录详细的错误日志,向调用者返回有意义的错误信息等,以确保程序的健壮性和可维护性。