Go语言通过panic触发运行时恐慌,中断函数执行并沿调用栈传递,可通过defer中的recover捕获,防止程序崩溃;recover仅在defer中直接调用有效,用于处理不可恢复错误或服务级防护,如中间件中捕获异常并返回500错误,建议优先使用error而非panic,避免滥用导致逻辑混乱。

在Go语言中,没有像其他语言那样的try-catch异常机制,而是通过 panic 和 recover 来处理运行时的严重错误。虽然不推荐将其作为常规错误处理手段,但在某些场景下合理使用能有效防止程序崩溃。
panic 会中断正常的函数执行流程,触发一个运行时恐慌。当调用 panic 后,当前函数停止执行,已经注册的 defer 函数会依次执行,然后将 panic 向上传递到调用栈。
常见触发场景:示例:
func badFunc() {
panic("oh no, something broke!")
}
func main() {
fmt.Println("start")
badFunc()
fmt.Println("this won't print")
}
输出结果会在打印 "start" 后终止,并显示 panic 信息。
立即学习“go语言免费学习笔记(深入)”;
recover 是一个内置函数,用于在 defer 中捕获正在发生的 panic。只有在 defer 函数中直接调用 recover 才有效。
recover 的典型用法:
func safeCall() {
defer func() {
if r := recover(); r != nil {
fmt.Println("recovered:", r)
}
}()
panic("test panic")
}
在这个例子中,程序不会崩溃,而是打印 "recovered: test panic" 并继续执行后续代码。
panic 和 recover 更适合处理不可恢复的错误或框架级保护,而不是替代 error 返回。以下是一些实用建议:
服务端常见防护模式:
func middleware(h http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
defer func() {
if err := recover(); err != nil {
log.Printf("panic caught: %v", err)
http.Error(w, "Internal Server Error", 500)
}
}()
h(w, r)
}
}
基本上就这些。关键是要明白:Go 推荐用 error 表示可预期的错误,而 panic 用于真正异常的情况,recover 则是最后一道防线。用好它们可以提升程序健壮性,但滥用会导致逻辑混乱。不复杂但容易忽略的是 defer 中 recover 的调用时机和作用范围。
以上就是Golang如何使用panic与recover处理异常的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号