MST
星途 面试题库

面试题:Go中复杂业务场景下panic和recover的使用

假设你正在开发一个微服务,其中涉及多个模块之间的调用。在某个模块处理数据时,如果出现了不符合预期的严重错误(例如数据库连接丢失且无法重试),你将如何使用panic和recover来确保整个服务不会崩溃,同时能正确记录错误信息并做相应处理?请给出关键代码示例。
36.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,可以通过在defer函数中使用recover来捕获panic,从而防止服务崩溃。以下是关键代码示例:

package main

import (
    "log"
)

// 模拟一个可能发生严重错误的函数
func criticalFunction() {
    // 模拟数据库连接丢失且无法重试的错误
    panic("数据库连接丢失且无法重试")
}

// 调用可能发生严重错误的函数,并处理错误
func safeCall() {
    defer func() {
        if r := recover(); r != nil {
            // 记录错误信息
            log.Printf("捕获到严重错误: %v", r)
            // 进行相应处理,例如通知监控系统等
        }
    }()

    criticalFunction()
}

func main() {
    safeCall()
    // 服务继续运行
    log.Println("服务继续正常运行")
}

在上述代码中:

  1. criticalFunction函数模拟了可能出现严重错误并触发panic的情况。
  2. safeCall函数通过deferrecover来捕获panic,避免服务崩溃。在recover捕获到错误后,记录错误信息并可以进行相应的后续处理。
  3. main函数调用safeCall,在捕获并处理错误后,服务可以继续正常运行。