使用defer和recover()实现捕获panic错误

  在没有捕获错误的前提下,程序出现错误会报panic然后停止继续执行(如果是在HTTP的handler函数里出现了panic还会导致HTTP服务停止,所以后果很严重),如下面代码中的divide()函数体里出现了除数为零的情况,程序就会报“runtime error: integer divide by zero”的panic并停止继续执行。

package main

import "fmt"

func divide() {
   num1 := 10
   num2 := 0
   fmt.Printf("%v / %v = %v \n", num1, num2, num1/num2)
}

func main() {
   divide()
   fmt.Println("后续逻辑……")
}

//========== 输出结果·开始 ==========//
// panic: runtime error: integer divide by zero
//
// goroutine 1 [running]:
// main.divide()
//         /inetpub/wwwroot/go/cmd/main.go:8 +0x2a
// main.main()
//         /inetpub/wwwroot/go/cmd/main.go:12 +0x19
// exit status 2
//========== 输出结果·结束 ==========//

  在正常情况下程序如果出现错误确实应该抛出错误然后停止继续执行,但如果出现的错误不会对程序造成致命影响,开发者可能希望跳过错误并继续执行程序,如下面的代码:

package main

import "fmt"

func divide() {
   // 使用defer和recover()实现捕获panic错误
   defer func() {
      err := recover()
      if err != nil {
         fmt.Println("程序粗错辣~", err)
      } else {
         fmt.Println("程序狠正常~")
      }
   }()

   num1 := 10
   num2 := 0
   fmt.Printf("%v / %v = %v \n", num1, num2, num1/num2)
}

func main() {
   divide()
   fmt.Println("后续逻辑……")
}

//========== 输出结果·开始 ==========//
// 程序粗错辣~ runtime error: integer divide by zero
// 后续逻辑……
//========== 输出结果·结束 ==========//

Copyright © 2023 码农人生. All Rights Reserved