go语言错误捕获和panic异常

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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函数的,下面来看这段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
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来终止程序,我们还可以捕获错误后继续执行程序,我们来看下一段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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配合使用,并且调用一定要在错误出现之前调用才有效果,这样捕获到了错误并且恢复了程序的控制权。

-------------本文结束感谢您的阅读-------------

本文标题:go语言错误捕获和panic异常

文章作者:Wuman

发布时间:2018年09月04日 - 12:09

最后更新:2018年09月05日 - 12:09

原始链接:http://yoursite.com/2018/09/04/go语言错误捕获和panic异常/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。