在 Go 中捕获 Panics
像错误一样,Panic 发生在运行时。 换句话说,当您的 Go 程序中出现意外情况导致执行终止时,就会发生 Panic。
当出现特定情况时,例如越界数组访问,运行时可能会发生 Panic。 这些典型的行为是索引数组超出其限制、进行类型测试、在 nil 指针上执行方法、错误地使用互斥锁以及尝试与关闭的通道交互。
大多数情况都是由编译器在构建软件时无法发现的编程错误引起的。 因为恐慌提供了解决问题的重要信息,所以开发人员经常使用 Panic 来表明他们在开发过程中犯了错误。
让我们看一些例子来捕捉 Golang 中的 Panic。
在 Go 中捕捉 Panic
下面的程序将打印一个人的全名。 fullName 函数输出一个人的全名。
此方法确定 firstName 和 lastName 指针是否为空。 如果它为 nil,则该函数会使用适当的消息调用 panic。
示例 1:
package main
import (
"fmt"
)
func fullName(firstName *string, lastName *string) {
if firstName == nil {
panic("runtime error: first name cannot be nil")
}
if lastName == nil {
panic("runtime error: last name cannot be nil")
}
fmt.Printf("%s %s\n", *firstName, *lastName)
fmt.Println("returned normally from fullName")
}
func main() {
firstName := "Jay"
fullName(&firstName, nil)
fmt.Println("returned normally from main")
}
输出:
panic: runtime error: last name cannot be nil
goroutine 1 [running]:
main.fullName(0x405058?, 0xc0000a2f70?)
/tmp/sandbox3339134150/prog.go:12 +0x114
main.main()
/tmp/sandbox3339134150/prog.go:20 +0x35
下面的代码显示 employee 函数是从 main 函数调用的。 我们提交员工的姓名和年龄作为输入。
当员工的年龄超过退休年龄时,员工功能进入 Panic 模式。
示例 2:
package main
func employee(name *string, age int) {
if age > 65 {
panic("Age cannot be greater than retirement age")
}
}
func main() {
empName := "Jay"
age := 73
employee(&empName, age)
}
输出:
panic: Age cannot be greater than retirement age
goroutine 1 [running]:
main.employee(...)
/tmp/sandbox4109873090/prog.go:5
main.main()
/tmp/sandbox4109873090/prog.go:12 +0x27
在 Go 中恢复 panic
recover
函数使用错误值来确定是否发生Panic。 因为 panic 函数的输入是一个空接口,所以它可以是任何类型。
任何接口类型,包括空接口,都有一个零值 nil。 如本例所示,必须注意防止使用 nil 作为 panic 的输入。
例子:
package main
import (
"fmt"
"log"
)
func main() {
divideByZero()
fmt.Println("Hey, we survived dividing by zero!")
}
func divideByZero() {
defer func() {
if err := recover(); err != nil {
log.Println("panic occurred:", err)
}
}()
fmt.Println(divide(1, 0))
}
func divide(a, b int) int {
if b == 0 {
panic(nil)
}
return a / b
}
输出:
we survived dividing by zero!
相关文章
在 Golang 中使用 If-Else 和 Switch Loop Inside HTML 模板
发布时间:2023/04/27 浏览次数:65 分类:Go
-
本篇文章介绍了在 Golang 的 HTML 模板中使用 if-else 和 switch 循环。因此,只要输出是 HTML,就应该始终使用 HTML 模板包而不是文本模板。
Golang 中的零值 Nil
发布时间:2023/04/27 浏览次数:166 分类:Go
-
本篇文章介绍 nil 在 Golang 中的含义,nil 是 Go 编程语言中的零值,是众所周知且重要的预定义标识符。
Golang 中的 Lambda 表达式
发布时间:2023/04/27 浏览次数:93 分类:Go
-
本篇文章介绍如何在 Golang 中创建 lambda 表达式。Lambda 表达式似乎不存在于 Golang 中。 函数文字、lambda 函数或闭包是匿名函数的另一个名称。
在 Go 中使用断言
发布时间:2023/04/27 浏览次数:181 分类:Go
-
本篇文章介绍了 assert 在 GoLang 中的使用。在 Go 语言中使用断言:GoLang 不提供对断言的任何内置支持,但我们可以使用来自 Testify API 的广泛使用的第三方包断言。
Go 中的随机数生成
发布时间:2023/04/27 浏览次数:114 分类:Go
-
本篇文章介绍如何在 Go 语言中使用随机数生成功能。Go 中的随机数生成 Go 语言为随机数生成功能提供内置支持。 内置包 math 有方法 rand(),用于随机数生成。