golang panic 函数用法示例详解
作者:学会了没
在Go语言中,panic用于触发不可恢复的错误,终止函数执行并逐层向上触发defer,最终若未被recover捕获,程序会崩溃,recover用于在defer函数中捕获panic,恢复程序流程,建议优先返回error,仅在严重错误或不可恢复场景下使用panic,并在关键位置recover,感兴趣的朋友一起看看吧
在 Go 语言中,panic 和 recover 是用于处理运行时异常的关键字。以下是它们的用法总结和示例:
1. panic 的作用
- 触发条件:当程序遇到无法恢复的严重错误时(如不可预料的逻辑错误、依赖项缺失等),
panic会终止当前函数的执行,并逐层向上触发defer,最后若未被recover捕获,程序会崩溃。 - 适用场景:
- 初始化阶段的关键资源缺失(如配置文件、数据库连接)。
- 代码逻辑中出现不可恢复的异常(如断言失败)。
2. 基本用法
package main
import \"fmt\"
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println(\"Recovered from panic:\", r)
}
}()
fmt.Println(\"Start\")
panic(\"something bad happened\") // 触发 panic
fmt.Println(\"End\") // 不会执行
}输出:
Start
Recovered from panic: something bad happened
3. recover 的使用规则
- 必须与
defer结合:recover只能在defer函数中生效。 - 仅在当前 goroutine 有效:无法捕获其他 goroutine 的 panic。
func mayPanic() {
panic(\"a problem occurred\")
}
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println(\"Recovered. Error:\", r)
}
}()
mayPanic() // 触发 panic
fmt.Println(\"After mayPanic()\") // 不会执行
}4. 错误处理建议
- 优先返回
error:常规错误应通过多返回值(如error类型)处理。 - 谨慎使用
panic:仅在严重错误或不可恢复场景下使用(如程序启动失败)。 - 在关键位置
recover:例如在 goroutine 的入口或 HTTP 请求处理器中,防止程序崩溃。
Web 服务器示例:
func handleRequest() {
defer func() {
if err := recover(); err != nil {
log.Println(\"Request failed:\", err)
}
}()
// 处理请求逻辑(可能触发 panic)
}5. 常见错误场景
- 未捕获的 panic:若未在
defer中调用recover,程序会崩溃。 - 跨 goroutine panic:每个 goroutine 需独立处理自己的 panic。
总结
panic:用于终止程序执行并传递错误信息。recover:在defer中捕获 panic,恢复程序流程。- 最佳实践:优先使用错误返回值,仅在必要时结合
panic和recover。
通过合理使用这两个关键字,可以提升程序的健壮性,避免因未处理异常导致的崩溃。
到此这篇关于golang panic 函数用法的文章就介绍到这了,更多相关golang panic 函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
