Go的错误处理defer、recover、panic

错误处理

在 Go 语言中,deferrecoverpanic 是用于处理错误和异常的关键机制。它们的作用和区别如下:


1. panic

  • 作用panic 用于触发一个运行时错误,导致程序立即停止当前函数的执行,并开始逐层向上回溯调用栈,执行每个函数的 defer 语句。
  • 使用场景:通常用于处理不可恢复的错误,例如程序逻辑错误、非法输入等。
  • 示例
    func main() {
        panic("something went wrong") // 触发 panic
        fmt.Println("This will not be printed")
    }
    
    输出:
    panic: something went wrong
    

2. recover

  • 作用recover 用于捕获 panic 并恢复程序的正常执行。它只能在 defer 函数中生效。
  • 使用场景:用于捕获并处理 panic,避免程序崩溃。
  • 示例
    func main() {
        defer func() {
            if r := recover(); r != nil {
                fmt.Println("Recovered from panic:", r)
            }
        }()
        panic("something went wrong") // 触发 panic
        fmt.Println("This will not be printed")
    }
    
    输出:
    Recovered from panic: something went wrong
    

3. defer

  • 作用defer 用于延迟执行一个函数调用,通常用于释放资源或执行清理操作。无论函数是否发生 panicdefer 语句都会在函数返回前执行。如果有多个defer,后被defer的语句先执行,也就是逆序执行。
  • 使用场景:用于资源管理(如关闭文件、释放锁等)或确保某些操作在函数结束时执行。
  • 示例
    func main() {
        defer fmt.Println("This will be printed last 1")
        defer fmt.Println("This will be printed last 2")
        fmt.Println("This will be printed first")
    }
    
    输出:
    This will be printed first
    This will be printed last 2
    This will be printed last 1
    

4. 三者的区别

特性 panic recover defer
作用 触发运行时错误,终止程序执行 捕获 panic,恢复程序执行 延迟执行函数调用
使用场景 处理不可恢复的错误 捕获并处理 panic 资源管理、清理操作
执行顺序 立即终止当前函数,逐层回溯调用栈 必须在 defer 函数中生效 在函数返回前执行
是否影响程序 导致程序崩溃(除非被 recover 捕获) 恢复程序正常执行 不影响程序执行,仅延迟操作

5. 综合示例

以下是一个结合 deferrecoverpanic 的示例:

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered from panic:", r)
        }
    }()
    fmt.Println("Start")
    riskyFunction()
    fmt.Println("End") // 这行不会被执行,因为 panic 导致函数提前返回
}

func riskyFunction() {
    defer fmt.Println("Defer in riskyFunction") // 这行会在 panic 后执行
    panic("something went wrong") // 触发 panic
}

输出:

Start
Defer in riskyFunction
Recovered from panic: something went wrong

6. 总结

  • panic:用于触发运行时错误,终止程序执行。
  • recover:用于捕获 panic,恢复程序正常执行。
  • defer:用于延迟执行函数调用,通常用于资源管理或清理操作。

三者通常结合使用,defer 确保资源释放,recover 捕获 panic 避免程序崩溃,panic 用于处理不可恢复的错误。

posted @ 2025-11-26 11:24  Rix^._.^  阅读(0)  评论(0)    收藏  举报