MST

星途 面试题库

面试题:Go语言recover在复杂业务逻辑中的应用

假设你正在开发一个Go语言的微服务,在某个核心业务函数中,可能会因为多种原因(如数据库连接异常、参数校验失败等)发生panic。请设计一个合理的错误处理机制,使用recover来捕获panic,并将错误信息记录到日志中,同时返回给调用方一个通用的错误响应,并且要考虑如何不影响服务的整体稳定性,尽可能快速恢复正常工作状态。描述代码的整体架构和关键实现步骤,并给出核心代码示例。
36.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 代码整体架构
    • 在核心业务函数外层包裹一个函数,用于调用核心业务函数并进行recover操作。
    • 核心业务函数处理具体的业务逻辑,可能会panic
    • 日志记录模块用于记录捕获到的错误信息。
    • 错误响应模块返回通用的错误响应给调用方。
  2. 关键实现步骤
    • 定义核心业务函数:编写实现具体业务逻辑的函数,在函数内部如果遇到如数据库连接异常、参数校验失败等情况,使用panic抛出异常。
    • 定义外层包装函数:这个函数调用核心业务函数,并使用deferrecover来捕获panic
    • 日志记录:捕获到panic后,将错误信息记录到日志中。
    • 返回通用错误响应:无论是否捕获到panic,都返回给调用方一个合适的响应,捕获到panic时返回通用错误响应。
  3. 核心代码示例
package main

import (
    "log"
)

// 核心业务函数,可能会panic
func coreBusinessFunction() {
    // 模拟参数校验失败
    var param string
    if param == "" {
        panic("参数校验失败")
    }
    // 模拟数据库连接异常
    // 这里省略实际的数据库连接代码,直接panic
    panic("数据库连接异常")
}

// 外层包装函数,处理panic并记录日志
func wrapperFunction() (string, error) {
    defer func() {
        if r := recover(); r != nil {
            log.Printf("捕获到panic: %v", r)
        }
    }()
    coreBusinessFunction()
    return "正常响应", nil
}

func main() {
    response, err := wrapperFunction()
    if err != nil {
        log.Println("返回错误响应")
        response = "通用错误响应"
    }
    log.Println("返回给调用方的响应:", response)
}

在上述代码中:

  • coreBusinessFunction是核心业务函数,模拟了参数校验失败和数据库连接异常时的panic
  • wrapperFunction通过deferrecover捕获panic,并使用log.Printf记录错误信息。
  • main函数调用wrapperFunction,如果发生错误则返回通用错误响应。这样设计可以在不影响服务整体稳定性的前提下,快速恢复正常工作状态。