Go 快速入门指南 - panic/recover 函数

panic

panic 会终止程序并退出,因此只有在发生严重的错误时才会使用 panic

例子

主动触发

package main

func main() {
    panic("some error...")
}

// $ go run main.go
// 输出如下 
/**
    panic: some error...

goroutine 1 [running]:
main.main()
        /home/codes/Go-examples-for-beginners/main.go:4 +0x27
exit status 2
*/

除 0

package main

import "fmt"

func main() {
    fmt.Println("除数不能为 0")

    n := 0
    fmt.Printf("5 / 0 = %d", 5/n)
}

// $ go run main.go
// 输出如下 
/**
  除数不能为 0
  panic: runtime error: integer divide by zero

  goroutine 1 [running]:
  main.main()
          /home/codes/Go-examples-for-beginners/main.go:15 +0x57
  exit status 2
*/

recover

建议先阅读 defer 小节。

recover 会终止 panic 状态并且返回 panic 的值,函数会从 panic 之前执行到的地方直接返回,不会继续往下执行。

语法规则

recover 和 defer 必须配套使用, 如果 recover 在其他地方执行会返回 nil,不会产生任何效果。 defer 必须在 panic 之前声明,否则 panic 会直接终止程序。

例子

错误捕获

package main

import "fmt"

func main() {
    if r := recover(); r != nil {
        fmt.Printf("捕获到 1 个错误: %v\n", r)
    }

    panic("测试")

    println("程序执行不到这里")
}

// $ go run main.go
// 输出如下 
/**
  panic: 测试
  ...
  ...
  exit status 2
*/

正确捕获

package main

import "fmt"

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Printf("捕获到 1 个错误: %v\n", r)
        }
    }()

    panic("测试")

    println("程序执行不到这里")
}

// $ go run main.go
// 输出如下 
/**
  捕获到 1 个错误: 测试
*/

联系我

公众号

posted @ 2022-12-22 16:30  洋芋土豆  阅读(106)  评论(0编辑  收藏  举报