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

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

package main

import (
   "fmt"
)

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

func main() {
   divide(1024, 0) // panic: runtime error: integer divide by zero

   // 重要说明:下面的代码是执行不到的,因为上面出现了panic
   fmt.Println("后续逻辑……")
}



  在绝大多数情况下,程序如果出现错误确实应该停止继续执行,但如果出现的错误不会对业务造成致命影响,开发者可能希望跳过错误并继续执行程序,这时就可以使用defer和recover()实现捕获panic错误,如下面的代码:

package main

import (
   "fmt"
)

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

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

func main() {
   divide(1024, 0)

   fmt.Println("后续逻辑……") // 后续逻辑……
}

Copyright © 2024 码农人生. All Rights Reserved