MST

星途 面试题库

面试题:Go中panic传播路径基础

请描述在Go语言中,当一个函数内部发生panic时,panic是如何在函数调用链中传播的?举例说明不同函数嵌套情况下panic的传播路径。
30.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,当一个函数内部发生panic时,panic会立即停止当前函数的执行,并开始在调用栈中向上传播。具体过程如下:

  1. 当前函数停止执行panic发生后,当前函数中panic语句之后的代码将不再执行。
  2. 清理defer:当前函数中所有已经注册的defer语句会按照后进先出(LIFO)的顺序依次执行。
  3. 传播至调用者:执行完defer后,panic会传播到调用当前函数的上层函数,上层函数重复上述1、2步骤,即停止执行剩余代码,执行defer,然后继续向上传播panic
  4. 程序终止:如果panic一直传播到main函数且没有被恢复(通过recover),程序将异常终止并打印出panic信息以及调用栈信息。

以下是不同函数嵌套情况下panic传播路径的示例:

package main

import "fmt"

func funcC() {
    panic("panic in funcC")
}

func funcB() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("recovered in funcB:", r)
        }
    }()
    funcC()
    fmt.Println("This line won't be printed")
}

func funcA() {
    funcB()
    fmt.Println("This line won't be printed either")
}

func main() {
    funcA()
    fmt.Println("This line won't be printed")
}

在上述代码中:

  • funcC中发生panicfuncCpanic后的代码不再执行。
  • funcC没有deferpanic传播到funcB
  • funcBfuncC调用之后的代码不再执行,funcBdefer执行,由于recoverpanic在此处被捕获,不会继续传播。
  • funcAmain函数中剩余代码正常执行,因为panicfuncB中被恢复。

如果在funcB中没有recoverpanic将继续传播到funcA,再到main,最终导致程序异常终止。