MST

星途 面试题库

面试题:Go panic与recover在复杂业务场景中的应用

假设你正在开发一个微服务,在处理某个请求时可能会因为多种原因(如数据库连接失败、数据格式错误等)触发panic。请描述如何合理地使用panic和recover机制来确保微服务不会崩溃,并且能够记录详细的错误信息以便后续排查问题。同时,编写相关代码示例来展示你的设计思路。
18.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 使用panicrecover机制的思路
    • 在业务逻辑中,如果遇到不可恢复的错误,如数据库连接失败、严重的数据格式错误等,使用panic抛出异常。
    • 在最外层的请求处理函数中使用recover来捕获panic,这样可以防止微服务崩溃。
    • 捕获panic后,记录详细的错误信息,包括错误类型、错误发生的位置等,以便后续排查问题。
  2. 代码示例(以Go语言为例)
package main

import (
    "fmt"
    "log"
)

// 模拟数据库连接函数
func connectDB() error {
    // 这里模拟连接失败,返回错误
    return fmt.Errorf("数据库连接失败")
}

// 模拟业务处理函数,可能会触发panic
func processRequest() {
    err := connectDB()
    if err != nil {
        panic(err)
    }
    // 其他业务逻辑
}

func main() {
    defer func() {
        if r := recover(); r != nil {
            // 记录详细错误信息
            log.Printf("捕获到panic: %v", r)
            // 这里可以做更多的错误处理,比如发送错误报告等
        }
    }()
    processRequest()
}

在上述代码中:

  • connectDB函数模拟数据库连接,这里返回一个错误来模拟连接失败。
  • processRequest函数调用connectDB,如果连接失败则触发panic
  • main函数中,使用deferrecover来捕获panic,并通过log.Printf记录详细的错误信息。这样即使processRequest中触发了panic,程序也不会崩溃,并且可以通过记录的错误信息来排查问题。