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