MST

星途 面试题库

面试题:Go 中 panic 和 recover 的基本使用场景

请描述 Go 语言中 panic 和 recover 各自的作用,并举例说明在一个简单的函数调用链中,如何恰当地使用 panic 抛出异常,以及使用 recover 捕获并处理这个异常。
14.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

panic 的作用

panic 用于在 Go 语言中主动抛出一个运行时错误,它会立即停止当前函数的执行,并开始展开调用栈,执行调用栈中每个函数的 defer 语句。如果 panic 没有被 recover 捕获,程序将会崩溃并打印出调用栈信息。

recover 的作用

recover 用于捕获由 panic 抛出的异常,它只能在 defer 函数中使用。当 recover 被调用时,如果当前的 goroutine 处于 panic 状态,它会停止 panic 过程并返回 panic 时传入的参数,从而让程序可以从 panic 中恢复并继续执行。

示例代码

package main

import (
    "fmt"
)

// 模拟一个可能会抛出异常的函数
func divide(a, b int) int {
    if b == 0 {
        panic("除数不能为零")
    }
    return a / b
}

// 调用链中的中间函数
func calculate() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("捕获到异常:", r)
        }
    }()
    result := divide(10, 0)
    fmt.Println("计算结果:", result)
}

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

在上述代码中:

  1. divide 函数在除数为零时使用 panic 抛出一个异常。
  2. calculate 函数通过 deferrecover 来捕获并处理 divide 函数抛出的异常。如果捕获到异常,打印出异常信息。
  3. main 函数调用 calculate 函数,在异常被捕获并处理后,程序能够继续执行,打印出 "程序继续执行"。