MST

星途 面试题库

面试题:Go语言中recover机制在处理不可预见错误时的基本原理是什么

请简要阐述Go语言中recover机制应对不可预见错误的基本工作原理,并举例说明如何在一个简单的函数中使用defer和recover捕获并处理运行时可能出现的panic错误。
30.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

1. recover机制应对不可预见错误的基本工作原理

  • 在Go语言中,panic用于主动抛出一个运行时错误,当panic发生时,当前函数会立即停止执行,其调用栈中的所有函数都会依次被终止,直到程序崩溃或者遇到recover
  • recover是一个内置函数,只能在defer函数中使用。当recover被调用时,如果当前的goroutine正处于panic状态,它会捕获panic时传入的参数,从而使goroutine恢复正常执行,调用栈不会继续展开,程序也不会崩溃。如果当前goroutine没有处于panic状态,recover调用将返回nil

2. 示例代码

package main

import (
    "fmt"
)

func divide(a, b int) int {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("捕获到panic:", r)
        }
    }()
    if b == 0 {
        panic("除数不能为零")
    }
    return a / b
}

func main() {
    result := divide(10, 0)
    fmt.Println("结果:", result)
}

在上述代码中:

  • divide函数用于执行除法运算。
  • 函数内部使用defer定义了一个匿名函数,在函数结束时会被调用。
  • 如果b为0,函数会panicdefer中的匿名函数会捕获到这个panic,输出错误信息,避免程序崩溃。
  • main函数中调用divide函数,即使divide函数发生panic,程序也不会崩溃,且会输出捕获到的错误信息。但由于panic发生后return a / b这行代码不会执行,所以result变量实际上不会被赋值为正确的结果。