Day19-Go错误处理(下)

前言

在昨天的文章,带来简单的错误处理运用,今天要带来较为实务上的运
Go 语言本身没有例外处理机制,而是以 defer、panic、recover 取而代之,用来满足错误处理的需求。

defer延迟执行

在 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 会导致系统崩溃和服务中断,所以 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,需要自己评估。

recover捕获错误

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] Day 11 - 让我们拆了这台无人机

引言 今天是机派X系列文章的第十一天。 昨天很寒酸的简介无人机,今天会从单一零件的角度一一将无人机的...

Checkbox 与 Radio 组件-金鱼都能懂的Bootstrap5网页框架开发入门

Bootstrap已是目前全球被大量网页开发者使用的一个网页UI框架了,其特色在於使用简单,开发快速...

前言与自我回顾

欢迎大家来看我的文章,这次我挑战的主题是 Android 架构,就如同我简介中说的,关於架构方面的文...

Day 07 借箸代筹(1):运算式、运算子

前文曾述及的陈述句(statement),是构成JavaScript程序的两大类语法之一,其之二,即...