为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Go

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 之前执行到的地方直接返回,不会继续往下执行。

语法规则

recoverdefer 必须配套使用, 如果 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 个错误: 测试
*/
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消