recover用于从panic中恢复程序执行,仅在defer中有效,可捕获当前goroutine的panic值并返回非nil结果,常用于Web中间件、goroutine错误防护等场景,需注意不可跨goroutine捕获、避免滥用为常规错误处理,并建议结合日志与堆栈跟踪提升排查能力。

在Golang中,recover 是一种用于从 panic 异常中恢复程序执行的内建函数。它只能在 defer 函数中生效,常用于防止因意外 panic 导致整个程序崩溃,尤其在库代码或服务型程序中非常实用。
recover() 是一个内建函数,调用后会停止 panic 的传播,并返回传递给 panic 的值。如果当前 goroutine 没有发生 panic,recover 返回 nil。
由于 panic 会中断正常流程,必须通过 defer 来注册 recover 调用,确保即使发生 panic,defer 中的代码仍会被执行。
示例代码:
func safeDivide(a, b int) {
defer func() {
if r := recover(); r != nil {
fmt.Println("捕获异常:", r)
}
}()
if b == 0 {
panic("除数不能为零")
}
result := a / b
fmt.Println("结果:", result)
}
调用 safeDivide(10, 0) 不会导致程序退出,而是输出“捕获异常: 除数不能为零”。
立即学习“go语言免费学习笔记(深入)”;
在 Web 服务、RPC 接口或长时间运行的 goroutine 中,局部错误不应导致整个服务宕机。通过 defer + recover 可以优雅处理这类问题。
常见应用场景包括:
func recoverMiddleware(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
defer func() {
if r := recover(); r != nil {
log.Printf("请求发生 panic: %v", r)
http.Error(w, "服务器内部错误", 500)
}
}()
next(w, r)
}
}
虽然 recover 很有用,但使用时需注意以下几点:
defer func() {
if r := recover(); r != nil {
fmt.Printf("panic: %v\n", r)
fmt.Printf("堆栈跟踪:\n%s", string(debug.Stack()))
}
}()
基本上就这些。recover 是 Go 中重要的异常控制机制,合理使用可提升程序健壮性,但不应滥用。关键是在关键入口(如中间件、goroutine 入口)设置保护层,让程序在出错时能安全退出或继续运行。不复杂但容易忽略细节。
以上就是如何在Golang中使用recover防止程序崩溃_Golangrecover异常恢复操作详解的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号