返回

Go 语言 panic 与 recover 深入浅出,轻松掌握异常处理

后端

一文掌握 Go 语言中 panic 与 recover 的作用和使用方法

在 Go 语言中,panic 和 recover 是两个用于处理异常情况的内置函数,它们可以帮助程序员在程序出现异常时采取相应的措施。

panic 的作用

panic 的作用是终止当前正在运行的程序(包括所有协程)并输出导致异常的堆栈信息。在遇到无法处理的异常情况时,例如比如数组越界、操作未初始化的 map、空指针等都会触发 panic。主动触发 panic 的方法是使用 panic 函数,例如:

package main

import "fmt"

func main() {
    // 主动触发 panic
    panic("这是一个错误")
}

当这段代码运行时,程序会立即终止并输出以下错误信息:

panic: 一个错误

goroutine 1 [running]:
main.main()
        /Users/username/workspace/go/src/main.go:7 +0x73
exit status 2

recover 的作用

recover 的作用是捕获 panic 抛出的异常信息并恢复程序的运行。recover 函数只能在 defer 函数中使用,例如:

package main

import "fmt"

func main() {
    // 使用 defer 捕获 panic 异常
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("捕获到 panic 异常:", err)
        }
    }()

    // 主动触发 panic
    panic("这是一个错误")
}

当这段代码运行时,程序不会立即终止,而是会执行 defer 函数并捕获 panic 抛出的异常信息。然后程序会继续运行,并打印出以下信息:

捕获到 panic 异常: 一个错误

panic 和 recover 的使用场景

panic 和 recover 通常用于处理以下场景:

  • 当程序遇到无法处理的异常情况时,可以使用 panic 函数终止程序并输出错误信息。
  • 当程序需要在出现异常情况时采取特殊的措施时,可以使用 defer 函数和 recover 函数捕获异常信息并恢复程序的运行。

panic 和 recover 的注意事项

在使用 panic 和 recover 时,需要注意以下几点:

  • panic 函数只能在 goroutine 中使用,不能在 main 函数中使用。
  • recover 函数只能在 defer 函数中使用,不能在其他函数中使用。
  • recover 函数只能捕获最近一次 panic 抛出的异常信息,不能捕获之前抛出的异常信息。
  • recover 函数不能捕获由 runtime 包中的函数抛出的异常信息。

总结

panic 和 recover 是 Go 语言中用于处理异常情况的两个内置函数。panic 的作用是终止当前正在运行的程序并输出导致异常的堆栈信息。recover 的作用是捕获 panic 抛出的异常信息并恢复程序的运行。panic 和 recover 通常用于处理无法处理的异常情况以及需要在出现异常情况时采取特殊的措施的场景。在使用 panic 和 recover 时,需要注意一些注意事项,例如 panic 函数只能在 goroutine 中使用,recover 函数只能在 defer 函数中使用等。