

新闻资讯
技术学院Go 中 panic 是运行时崩溃机制,需用 defer + recover 捕获:defer 必须在 panic 前注册,recover 仅在 defer 函数内有效,可停止 panic 传播并恢复执行,但不修复错误状态。
在 Go 中,panic 不是传统意义上的“异常”,而是一种运行时错误导致的程序崩溃机制。它会立即中断当前函数执行,并向上逐层传播,直到被 recover 捕获,或最终终止整个程序。要安全地处理 panic,必须配合 defer 和 recover 使用——且仅在 defer 调用的函数中调用 recover 才有效。
defer 语句会在函数返回前(包括因 panic 而提前返回)按后进先出顺序执行。因此,想捕获 panic,defer 的调用必须出现在 panic 可能发生的位置之前:
defer func() { if r := recover(); r != nil { log.Println("Recovered:", r) } }()
recover 是一个内建函数,只能在 defer 延迟执行的函数内部调用才起作用。如果直接在普通逻辑中调用,它总是返回 nil:
defer func() { recover() }() 中调用
if err != nil { recover() } 中调用(此时 panic 已传播出去或尚未发生)成功调用 recover 会停止 panic 的传播,并恢复 goroutine 的正常执行。但这不等于“错误已修复”:
典型的安全包装方式是用匿名函数包裹可能 panic 的代码块:
SafeRun(func()) error,统一 recover 并返回错误defer func() { if r := recover(); r != nil { http.Error(w, "Internal Error", http.StatusInternalServerError) } }()
os.Exit 或协程外的系统级崩溃(如 SIGKILL)引发的终止