在 Go 中处理恐慌

本文介绍了Go中处理恐慌(panic)的概念,包括panic的原因,如数组越界、空指针调用方法等,以及如何使用defer、recover内置函数来捕获和恢复panic,以防止程序意外终止。通过示例代码,展示了如何在发生panic时执行清理操作并恢复程序的正常流程。
摘要由CSDN通过智能技术生成

在 Go 中处理恐慌

目录

  1. 如何在 Ubuntu 18.04 上安装 Go 和设置本地编程环境
  2. 如何在 macOS 上安装 Go 和设置本地编程环境
  3. 如何在 Windows 10 上安装 Go 和设置本地编程环境
  4. 如何用 Go 编写你的第一个程序
  5. 理解 GOPATH
  6. 如何在 Go 中写注释
  7. 理解 Go 的数据类型
  8. Go 中处理字符串的介绍
  9. 如何在 Go 中格式化字符串
  10. 介绍 Go 中的 Strings 包
  11. 如何在 Go 中使用变量和常量
  12. 如何在 Go 中转换数据类型
  13. 如何用运算符在 Go 中做数学计算
  14. 了解 Go 中的布尔逻辑
  15. 理解 Go 中的 Map
  16. 理解 Go 中的数组和切片
  17. 在 Go 中处理错误
  18. 在 Go 中创建自定义错误
  19. 在 Go 中处理恐慌
  20. 在 Go 中导入包

介绍

程序遇到的错误分为两个广泛的类别:程序员已经预料到的错误和程序员没有预料到的错误。我们在前两篇关于 [错误处理]({ {< relref "/docs/12-How_To_Convert_Data_Types_in_Go.md" >}}) 的文章中介绍过的 error 接口主要用于处理我们在编写 Go 程序时可能遇到的错误。error 接口甚至允许我们去确认在调用一个函数时发生罕见性错误的可能性,因此我们可以在这些情况下进行适当的响应。

Panics 属于第二类错误,这些错误是程序员意料之外的。这些意料之外的错误导致一个 GO 程序自发终止并退出运行。常见的错误通常是造成 panic 的原因。在本教程中,我们将研究哪些常见操作可以引起 panic ,我们还将看到避免这些 panic 的方法。我们还将使用 [defer]({ {< relref "/docs/29-Understanding_defer_in_Go.md" >}}) 语句与 recover 函数一起捕获 panic,以免 panic 有机会意外终止我们正在运行的 GO 程序。

了解 panics

GO 中的某些操作会自动返回 panic 并停止程序的运行。常见的操作包括索引超出 数组 的容量,执行类型的断言,空指针上的调用方法,错误地使用互斥锁以及尝试使用已经关闭的 chanel 等等。这些情况中的大多数是由于编程时犯错而导致的,再加上编译器在编译程序时没有检测到这些错误。

由于 panic 包含了有助于解决问题的细节,所以开发者通常会使用 panic 来标记在开发过程中犯了一个错误。

由于越界引发的 panic

当你尝试访问超出切片长度或数组容量之外的索引时,GO 运行时会产生 panic。

下面的示例是尝试使用内置的 len 函数返回的切片的长度, 然后访问切片的最后一个元素时常见错误。尝试运行此代码以了解为什么这可能会引起 panic:

package main

import (
 "fmt"
)

func main() {
 names := []string{
  "lobster",
  "sea urchin",
  "sea cucumber",
 }
 fmt.Println("My favorite sea creature is:", names[len(names)])
}

这将会有有以下输出:

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

goroutine 1 [running]:
main.main()
# 备注这一块信息可能会有不一样的输出
/tmp/sandbox879828148/prog.go:13 +0x20

panic 输出的名称提供了一个提示:panic: runtime error: index out of range。我们用三个海洋生物创建了一个切片。然后,我们尝试通过使用内置的 len 函数将切片的长度作为索引来获取切片的最后一个元素。请记住,切片和数组的第一个元素的下标都是 0; 因此,第一个元素的索引是 0,此切片中的最后一个元素在索引2。由于我们尝试在第三个索引,3 时,因此切片中没有元素要返回并且超出了切片的边界。运行时别无选择,只能终止和退出,因为我们要求它做一些不可能的事情。Go 在编译过程中也无法证明此代码将尝试执行此操作,因此编译器无法捕获到这种操作。

还请注意,后续代码还没被执行。这是因为 panic 是一个完全阻止执行你的 GO 程序的事件。其中产生的消息中包含多个有助于诊断 panic 的原因。

剖析 panic

panics 由指示 panic 的原因和一个 堆栈跟踪 信息组成,这些可帮助你在代码中找到 panic 的位置。

任何 panic 的第一部分都是消息。它始终将以字符串

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值