MST

星途 面试题库

面试题:Go语言在并发场景下panic异常与恢复策略

假设有一个Go语言的并发程序,包含多个goroutine,其中某个goroutine可能会触发panic异常。请描述如何设计一种机制,使得该goroutine的panic异常不会导致整个程序崩溃,同时能够将异常信息传递到主goroutine进行统一处理,并编写相应的示例代码。
46.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,可以使用recover函数来捕获panic并防止程序崩溃。以下是实现这种机制的方法及示例代码:

  1. 使用defer语句和recover函数在可能发生panicgoroutine内部捕获异常。
  2. 使用通道(channel)将异常信息传递给主goroutine

示例代码如下:

package main

import (
    "fmt"
)

func main() {
    // 创建一个用于传递异常信息的通道
    errCh := make(chan interface{})

    // 启动一个goroutine
    go func() {
        defer func() {
            if r := recover(); r != nil {
                // 将捕获到的异常信息发送到通道
                errCh <- r
            }
        }()

        // 模拟可能触发panic的操作
        panic("模拟一个panic异常")
    }()

    // 从通道接收异常信息
    for err := range errCh {
        fmt.Printf("在主goroutine中捕获到异常: %v\n", err)
        // 这里可以进行统一的异常处理,例如记录日志等
        close(errCh) // 处理完后关闭通道
    }
}

在上述代码中:

  1. defer语句中的匿名函数会在goroutine结束时执行,通过recover函数捕获panic
  2. 如果捕获到panic,则将异常信息通过errCh通道发送给主goroutine
  3. goroutine通过for... range循环从通道接收异常信息,并进行统一处理。处理完后关闭通道,以避免死锁。