首页 > 其他分享 >Go 快速入门指南 - panic/recover 函数

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

时间:2022-12-24 18:36:35浏览次数:47  
标签:defer recover fmt go Go main panic

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 个错误: 测试
*/

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

标签:defer,recover,fmt,go,Go,main,panic
From: https://blog.51cto.com/u_15915979/5967431

相关文章

  • Go 快速入门指南 - 结构体
    概述​​结构体​​​ 是将零个或多个字段(变量)组合在一起的复合数据类型,类似于面向对象语言中的 ​​对象​​。结构体以及其字段都使用 可见性 规则。语法规则type......
  • Go 快速入门指南 - 嵌套结构体
    概述Go支持将多个结构体通过嵌套的方式,组成一个大的结构体,降低了单个结构体复杂度,同时提高了结构体之间组合的灵活性。例子为了省略篇幅,本小节只使用 ​​字面量​​​ ......
  • Go 快速入门指南 - 函数
    概述​​函数​​ 是将一个或者一类问题包装为一个代码块,可以被多次调用,提高代码重用性。Go函数中声明、定义、参数、返回值这些基础概念,和其他编程语言中的一致,这里不再......
  • Go 快速入门指南 - init 函数
    概述​​init()函数​​ 是一个特殊的函数,一般称为初始化函数,不能被调用。 在每个文件里面,当程序启动或者文件被作为包引用的时候,init()函数就会自动执行,一般用来做一......
  • Go 快速入门指南 - 接口和方法
    接口Go接口是隐式实现。 对于一个数据类型,无需声明它实现了哪些接口,只需要实现接口必需的方法即可。当然了,存在一个小问题就是:我们可能无意间实现了某个接口:),所以 ​......
  • Go 快速入门指南 - 判断是否实现接口
    判断是否实现接口Go里面没有 ​​implements​​ 关键字来判断一个结构体(对象)是否实现了某个接口, 要实现类似的功能,需要用到 ​​类型断言​​。类型断言//判断......
  • Go 快速入门指南 - 零值和错误
    零值当一个变量使用 ​​var​​​ 进行声明后并未进行初始化(变量后面没有赋值符 ​​=​​)操作,会默认分配一个零值(zerovalue)。不同类型对应的零值类型零值boolf......
  • Go 快速入门指南 - 类型比较
    概述​​比较运算符​​​ 用来比较两个操作数并返回一个 ​​bool​​ 值,常见的比较运算符:==等于!=不等于<小于<=小于等于>大于>=大于等于......
  • Go 快速入门指南 - goroutine
    概述goroutine是Go程序并发执行的实体,对于初学者来讲,可以简单地将 ​​goroutine​​​ 理解为一个 ​​超轻量的线程​​。当一个程序启动时,只有一个goroutine调用......
  • Go 快速入门指南 - 缓冲通道和非缓冲通道
    概述建议先阅读 goroutine 小节。Go箴言:不要通过共享内存来通信,而要通过通信来共享内存。​​goroutine​​​ 是Go程序并发执行的实体,​​channel(通道)​​​ ......