go语言中的错误捕获recover和panic异常

在Go语言中我们首先来看一下err错误信息,我们先来看一段代码

package main
import (
    "fmt"
    "errors"
)
func calc(a int, b int) (v int, err error) {
    //捕获错误信息
    if b == 0 {
        //如果代码中出现错误 可以使用errors.New()创建错误信息
        err = errors.New("除数不能为0")
        return
    }
    v = a / b
    return
}
func main() {
    a := 10
    b := 0
    v, err := calc(a, b)
    //根据错误信息进行处理
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(v)
    }
    //fmt.Println(v)
}

在这里我们可以接收到错误信息并打印出来,我们先看一下会报错吗?结果显示部会报错的,因为我们接收到了错误并打印出来了
这里写图片描述
我们看这里并没有报错,而是打印出了错误 信息,

在Go中我们还可以直接调用panic函数来终止程序,这里写图片描述
我们来看这张图,这张图里面我们给数组定义为10个长度,然后下面直接调用下标为10的数组,这样会出什么错误呢,这样就是数组下标超出范围,因为数组下标是从0开始到长度减一,我们来看一下编译器运行的结果报什么错,
这里写图片描述
编译提示panic异常,然后提示数组下标越界,这是因为当我们写程序时,比如遇到一些错误比如:数组下标越界,空指针异常,野指针这些错误的时候,系统就会调用自己本身的panic函数,那么我们自己在写程序的时候也是可以调用panic函数的,下面来看这段代码

package main
import "fmt"
func main() {
    fmt.Println("hello world1")
    fmt.Println("hello world2")
    fmt.Println("hello world3")
    //程序可以运行 但是遇到panic停止
    //当程序遇到panic时  会自动崩溃
    panic("终止程序")
    fmt.Println("hello world4")
    fmt.Println("hello world5")
    fmt.Println("hello world6")
}

我们来看一下运行结果这里写图片描述
在这里我们看到,只打印了上面的三句话,当遇到panic函数的时候就会程序崩溃,然后下面的程序停止执行,我们不仅仅可以使用panic来终止程序,我们还可以捕获错误后继续执行程序,我们来看下一段代码

package main
import "fmt"
func test(i int) {
    var arr [10]int
    //优先使用错误拦截 在错误出现之前进行拦截 在错误出现后进行错误捕获
    //错误拦截必须配合defer使用  通过匿名函数使用
    defer func() {
        //恢复程序的控制权
        err := recover()
        if err != nil {
            fmt.Println(err)
        }
    }()

    arr[i] = 123 //err panic
    fmt.Println(arr)
}
func main() {
    i := 10
    test(i)
    fmt.Println("hello world")
}

看这段代码,然后我们来看一下运行结果
这里写图片描述
第一句话直接打印出了错误:运行时错误,数组下标越界,但是程序并没有终止而是继续运行下去了这是为什么了,
这里写图片描述
如图所示,这里我们延迟调用了一下,因为recover必须和defer配合使用,并且调用一定要在错误出现之前调用才有效果,这样捕获到了错误并且恢复了程序的控制权。

猜你喜欢

转载自blog.csdn.net/sgsgy5/article/details/81635559