MST
星途 面试题库

面试题:Go语言中使用Gopanic处理不可恢复错误的最佳实践

在一个复杂的Go项目中,涉及多个包和函数调用。假设某个核心业务流程遇到了不可恢复的错误,例如数据库连接异常且无法自动重试,需要使用`panic`处理。请描述你会如何设计代码结构和错误处理逻辑,以确保错误能合理传递和处理,同时尽量减少对其他正常业务逻辑的影响。请提供核心代码片段来说明。
20.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 代码结构设计
    • 在每个可能发生错误的函数中,明确返回错误。
    • 对于调用链,上层函数负责检查下层函数返回的错误,并决定如何处理。
    • 将核心业务逻辑封装在一个独立的函数中,以便集中处理错误。
  2. 错误处理逻辑
    • 当遇到不可恢复的错误(如数据库连接异常且无法自动重试)时,在核心业务逻辑函数中使用panic
    • 在外层使用recover来捕获panic,并进行适当的清理和日志记录等操作,防止程序崩溃影响其他正常业务逻辑。
  3. 核心代码片段
package main

import (
    "fmt"
)

// 模拟数据库连接函数
func connectDB() error {
    // 这里模拟一个数据库连接失败的情况
    return fmt.Errorf("database connection error")
}

// 核心业务逻辑函数
func coreBusinessLogic() {
    err := connectDB()
    if err != nil {
        // 不可恢复的错误,使用panic
        panic(fmt.Sprintf("fatal error in core business: %v", err))
    }
    // 其他核心业务逻辑代码
    fmt.Println("Core business logic executed successfully")
}

func main() {
    defer func() {
        if r := recover(); r != nil {
            // 捕获panic并处理
            fmt.Printf("Recovered from panic: %v\n", r)
            // 可以在这里进行日志记录等清理操作
        }
    }()
    coreBusinessLogic()
    // 这里的其他业务逻辑不会因为coreBusinessLogic中的panic而被中断
    fmt.Println("Other normal business logic")
}