在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配合使用,并且调用一定要在错误出现之前调用才有效果,这样捕获到了错误并且恢复了程序的控制权。