MST

星途 面试题库

面试题:Go并发程序中如何优雅处理panic并恢复

假设你正在开发一个多协程的Go程序,其中某个协程可能会发生panic,描述如何在不影响其他协程正常运行的前提下,捕获并适当处理这个panic,确保程序整体的稳定性,并给出简单的代码示例。
46.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,可以使用recover函数来捕获panic。以下是具体做法:

  1. 在可能发生panic的协程中使用defer语句,在defer函数中调用recover
  2. 这样即使该协程发生panic,也能捕获并处理,不会影响其他协程。

代码示例如下:

package main

import (
    "fmt"
)

func worker() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("捕获到panic:", r)
        }
    }()

    // 模拟可能发生panic的操作
    panic("发生了一个panic")
}

func main() {
    go worker()

    // 主线程做其他事情,比如等待一段时间
    select {}
}

在上述代码中:

  • worker函数中使用defer语句定义了一个匿名函数,这个匿名函数中使用recover捕获panic
  • main函数中启动了worker协程,并且通过select {}让主线程不会退出,从而观察到worker协程中panic被捕获处理的情况。