在昨天的文章,带来简单的错误处理运用,今天要带来较为实务上的运
Go 语言本身没有例外处理机制,而是以 defer、panic、recover 取而代之,用来满足错误处理的需求。
在 Go 语言中,可以使用 defer 来使某个韩式达到延迟的效果,我们来看一下这个所谓延迟的效果:
package main
import (
"fmt"
)
func main() {
defer fmt.Println(1)
fmt.Println(2)
}
上述的程序码会先印出2,在印出1,这是就是延迟的效果,在 main function 中,在最後 return 前,执行 defer 後的程序码。
那如果有多个函式被冠上 defer 呢?我们看下列的程序码:
package main
import (
"fmt"
)
func main() {
defer fmt.Println(1)
defer fmt.Println(2)
fmt.Println(3)
}
这样印出来的顺序为3、2、1,所以我们得知,印出的顺序跟 defer 的顺序相反,也就是第一个 defer,会最後一个执行。
使用 panic 会导致系统崩溃和服务中断,所以 panic 会使用在发生较重大错误的时候,我们这里稍微将昨天程序更改一下:
package main
import (
"fmt"
"strconv"
)
func main() {
i, err := strconv.Atoi("0.5")
if err != nil {
panic("crash")
fmt.Println("couldn't convert number:", err)
}
fmt.Println("Converted integer:", i)
}
在执行後会产生里面的错误讯息,且不会执行後面的程序码,来看看他输出的结果:
panic: crash
其实这个例子只是简单举例 panic 的作用,在你自己的服务中,什麽时候要使用到 panic,需要自己评估。
Go 语言中没有try-catch这类的捕捉语法,但提供 recover 可以捕捉到 panic 抛掷错误,以回复系统以避免程序崩溃。因为 defer 在程序码最後必执行的特性,recover 必须和 defer 配合使用,如下:
package main
import (
"fmt"
"strconv"
)
func main() {
i, err := strconv.Atoi("0.5")
defer func() {
if err := recover(); err != nil {
fmt.Println("couldn't convert number:", err)
}
}()
if err != nil {
panic("crash")
}
fmt.Println("Converted integer:", i)
}
在执行 panic 後系统并无直接崩溃,而是继续执行 recover 後面的程序码,但一样,在 panic 後的程序码是不会被执行的。
今天介绍 defer、panic、recover 三者的使用方式,而在使用上,需考虑到自己的需求。Go 语言中,使用 error 的话,可以明确地进行错误检查;而使用 panic 会比较便於传播错误,建议搭配 recover 使用以捕捉错误,并转换成 error。
<<: Day 15:如何解决 PowerShell 无法使用 Angular 指令的问题?
>>: Day-26 吹奏创意的一曲、红透半边天的 Switch
引言 今天是机派X系列文章的第十一天。 昨天很寒酸的简介无人机,今天会从单一零件的角度一一将无人机的...
Bootstrap已是目前全球被大量网页开发者使用的一个网页UI框架了,其特色在於使用简单,开发快速...
欢迎大家来看我的文章,这次我挑战的主题是 Android 架构,就如同我简介中说的,关於架构方面的文...
=x= 🌵 建立 Specification Manager - Content Page 後台页面...
前文曾述及的陈述句(statement),是构成JavaScript程序的两大类语法之一,其之二,即...