Go,你也可以的!-【7.2 panic】

7.2 panic

panic就是Go语言中的崩溃,崩溃也就是程序不可用,这在实际的业务中基本是最严重的BUG

在大部分语言中,产生崩溃的原因基本是差不多的,大多都是访问了空指针、数组越界、内存溢出等。

基本可以总结为,发生崩溃都是与系统进行了非法的内存或资源操作。

本节代码存放目录为 lesson20

如何发生panic

我们在开发中应该极力避免发生panic,想要知道怎么避免,我们首先需要知道panic是怎么发生。

数组越界是经常遇到的崩溃原因,也就是说数组本身只有3个元素,但是却去访问了第4个元素,这时候访问不到就会出现崩溃。

但是事实上,在Go语言中,是不可能出现数组越界的,当我们在代码中尝试访问越界的元素时,代码将会报错。

这是由于数组是长度固定的,所以编译器是会为我们进行代码检查的。

那么我们就可以想到,切片是长度可变的,那是不是就是会出现呢?答案是肯定的,代码如下所示:

var testSlice = []int{1, 2, 3}
fmt.Println(testSlice[4])

如何定位排查

执行上一段的代码,结果输出如下:

panic: runtime error: index out of range [4] with length 3

goroutine 1 [running]:
main.main()
        /Users/xc/xcWork/YouCanGo/Code/YouCanGoCode/lesson20/lesson20.go:7 +0x1d
exit status 2

我们可以直接看到崩溃信息,通过崩溃信息我们可以快速的知道是什么原因产生的崩溃,如下所示:

panic: runtime error: index out of range [4] with length 3

同时在Go语言中我们也可以快速定位到具体发生panic发生的代码行数,如下所示:

/Users/xc/xcWork/YouCanGo/Code/YouCanGoCode/lesson20/lesson20.go:7 +0x1d

从上面的输出,我们可以快速知道发生崩溃的地方,也就是代码的第7行。

手动panic

Go语言中,如果我们想要让程序主动崩溃,我们可以直接使用panic关键字,如下代码所示:

a := "123t"
num, err := strconv.ParseInt(a, 10, 64)
if err != nil {
	panic(err)
}
fmt.Println(num)

在上面的代码中,在发生错误时,我们直接使用panic(err)进行操作,这样就会导致程序直接崩溃。

这种方法在实际业务也有一些应用场景。

比如说当发生一些安全错误时,我们就将程序主动崩溃。

比如发生错误会导致继续运行而产生更严重的逻辑错误,我们可以进行主动崩溃。

小结

本节我们对panic的发生、排查进行了讲解,总结如下:

  • panic就是Go语言里的崩溃

  • 切片访问越界、空指针等会导致崩溃

  • 通过崩溃堆栈输出可以快速定位崩溃原因及崩溃代码

  • 可以通过panic(err)将程序主动崩溃

书籍地址:https://youcan.golang.website/

书籍代码:https://github.com/YouCanGolang

我的GitHub:https://github.com/swxctx

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Swxctx

您的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值