MST

星途 面试题库

面试题:Go语言panic与recover在并发场景下的应用

在一个包含多个goroutine的Go程序中,如果其中一个goroutine发生了panic,如何使用recover来确保整个程序不会崩溃,并且能够正确处理这个异常?请给出详细的代码实现思路和关键代码片段。
37.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 代码实现思路
    • 在可能发生panicgoroutine中,通过defer关键字定义一个函数,在这个函数中使用recover来捕获panic
    • recover只有在defer函数中调用才有效,它会捕获到panic传递的参数,从而实现异常处理。
    • 可以通过在主goroutine或其他合适的地方设置一个机制来处理从发生panicgoroutine传递出来的错误信息。
  2. 关键代码片段
package main

import (
    "fmt"
)

func main() {
    // 启动一个goroutine
    go func() {
        defer func() {
            if r := recover(); r != nil {
                // 捕获到panic,处理异常
                fmt.Println("Recovered from panic:", r)
            }
        }()
        // 模拟可能发生panic的操作
        panic("Some error occurred")
    }()

    // 防止主程序立即退出
    select {}
}

在上述代码中:

  • 定义了一个匿名goroutine,在这个goroutine中通过defer定义了一个匿名函数。
  • 在匿名函数中使用recover捕获panic,如果捕获到panic(即r != nil),则打印出捕获到的panic信息。
  • goroutine中的select {}用于防止主程序立即退出,这样可以观察到goroutinepanic的捕获和处理情况。