MST

星途 面试题库

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

假设你正在开发一个包含多个嵌套函数调用的复杂业务逻辑模块,其中某些函数可能会因为各种原因(如资源不足、数据格式错误等)发生panic。请阐述如何合理使用recover方法,确保整个业务逻辑在出现异常时能够进行优雅的错误处理,同时不影响其他部分的正常运行。你可以结合具体的业务场景(例如订单处理系统中的订单创建、库存更新、支付等环节)进行说明,并给出关键代码片段。
27.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,recover用于捕获并处理panic,从而实现优雅的错误处理。以下结合订单处理系统的业务场景来阐述如何使用。

业务场景

在订单处理系统中,订单创建、库存更新、支付等环节可能会因为各种原因panic。例如库存不足时库存更新函数可能panic,支付接口参数错误时支付函数可能panic

关键代码片段

package main

import (
    "fmt"
)

// 模拟库存更新函数
func updateStock(orderID string, quantity int) {
    // 这里简单模拟库存不足情况
    if quantity > 100 {
        panic("库存不足")
    }
    fmt.Printf("订单 %s 库存更新成功,数量: %d\n", orderID, quantity)
}

// 模拟支付函数
func processPayment(orderID string, amount float64) {
    // 这里简单模拟支付参数错误情况
    if amount <= 0 {
        panic("支付金额错误")
    }
    fmt.Printf("订单 %s 支付成功,金额: %.2f\n", orderID, amount)
}

// 订单创建主函数
func createOrder(orderID string, quantity int, amount float64) {
    defer func() {
        if r := recover(); r != nil {
            fmt.Printf("订单处理过程中发生错误: %v\n", r)
        }
    }()

    updateStock(orderID, quantity)
    processPayment(orderID, amount)
    fmt.Printf("订单 %s 创建成功\n", orderID)
}

你可以通过以下方式调用:

func main() {
    createOrder("12345", 150, 100.0)
    createOrder("67890", 50, 50.0)
}

代码说明

  1. deferrecover:在createOrder函数中,使用defer关键字定义了一个匿名函数,在函数结束时执行。recover用于捕获panic,如果捕获到panic,则打印错误信息。
  2. 业务函数updateStockprocessPayment模拟业务逻辑函数,可能会panic
  3. 调用示例:在main函数中,调用createOrder函数处理订单,一个订单因库存不足panic,另一个订单正常处理。通过这种方式,确保整个业务逻辑在出现异常时能够进行优雅的错误处理,不影响其他部分的正常运行。