面试题答案
一键面试在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)
}
代码说明
defer
与recover
:在createOrder
函数中,使用defer
关键字定义了一个匿名函数,在函数结束时执行。recover
用于捕获panic
,如果捕获到panic
,则打印错误信息。- 业务函数:
updateStock
和processPayment
模拟业务逻辑函数,可能会panic
。 - 调用示例:在
main
函数中,调用createOrder
函数处理订单,一个订单因库存不足panic
,另一个订单正常处理。通过这种方式,确保整个业务逻辑在出现异常时能够进行优雅的错误处理,不影响其他部分的正常运行。