网络编程
位置:首页>> 网络编程>> Go语言>> Go错误处理之panic函数和recover函数使用及捕获异常方法

Go错误处理之panic函数和recover函数使用及捕获异常方法

作者:雨雨不怕雨  发布时间:2024-02-13 02:16:12 

标签:go,异常,panic,recover

前言

前面我们讲过了error类型来处理一般的错误,本文会描述使用panic函数和recover函数来处理比较极端的错误。简单来说,当程序运行时遇到无法处理的错误或异常情况时,会调用panic函数引发一个运行时错误,此时程序会终止执行并抛出错误信息。为了避免程序崩溃,可以使用recover函数来捕获错误,并进行处理或恢复程序的执行,通常recover函数写在defer语句中。

panic函数

panic函数是内置的一个函数,他的结构如下:

func panic(v interface{})

此函数接受一个接口类型的值,这个值通常是错误的描述,调用次函数后,会引发异常,这将中止当前的程序流程,并在堆栈中记录当前的异常信息。此函数可以被主动调用,也可以在发生数组越界、空指针引用等情况下被动调用。

我们将上篇文章的除法例子进行小小的修改,使用panic进行错误处理:

package main
import (
  "fmt"
)
func divide(a, b int) int{
  if b == 0 {
     panic("division by zero")
  }
  return a / b
}
func main() {
  result := divide(10, 0)
  fmt.Println("the result is ",result)
}

运行后,程序直接退出了,报division by zero错误。

recover函数

有些时候,我们不希望panic函数直接粗暴的退出,这时候我们可以使用recover函数对pannic进行捕获,注意,recover函数只能写在defer关键字之后哦!

recover也是内置函数,他的结构如下:

func recover() interface{}

他能捕获到的panic函数报出的错误,并使用接口类型进行返回。

我们使用recover对例子再次修改,让程序可以继续的运行,而不是粗暴的退出,代码如下:

package main
import (
  "fmt"
)
func divide(a, b int) int{
  defer func() {
     if err:=recover();err!=nil {
        fmt.Printf("runtime panic : %v\n", err)
     }
  }()
  if b == 0 {
     panic("division by zero")
  }
  return a / b
}
func main() {
  result := divide(10, 0)
  fmt.Println("the result is ",result)
}

来源:https://blog.csdn.net/doreen211/article/details/129735009

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com