0%

Go语言错误处理


go语言中错误处理方式为:

1
panic()-defer-recover()

Go语言中可以使用panic()函数抛出一个错误,然后在defer中通过recover()函数捕获异常进程后续处理。

panic()

  • go语言的内置函数,用于抛出错误,定义如下:
    1
    func panic(v interface {})
  • 请注意,如果单独只使用panic()对错误进行抛出,后续程序将终止执行

defer

defer是go语言的预留关键字,用于延迟执行函数的执行。通常在资源释放、链接关闭、函数结束时调用。多个defer为堆栈结构,后进先出,并且在压栈时不能有未知变量或函数defer在此可用于异常抛出后的处理。

recover()

  • go语言的内置函数,用于获取异常,多次调用时只有第一次能获取值,定义:
    1
    func recover() interface{}

示例

  • err1.go代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    package errlab

    import "fmt"

    //defer recover 来处理错误

    func Testerr(){
    //使用defer+recover来捕获和处理异常
    //匿名函数
    defer func(){
    err:=recover() //recover()是内置函数,可以捕获异常
    if err!=nil{ //捕获到错误
    fmt.Println("err=",err)
    }

    }()

    num1:=10
    num2:=0
    res:=num1/num2
    fmt.Println("res=",res) //err= runtime error: integer divide by zero
    }
  • main主函数:

    1
    2
    3
    4
    5
    6
    func main() {
    //错误err的练习
    errlab.Testerr()
    fmt.Println("错误后是否会输出@!!")

    }
  • 输出结果:

    1
    2
    err= runtime error: integer divide by zero
    错误后是否会输出@!!

    从输出结果看出panic()-defer-recover()错误处理并没有影响主程序的代码

err.new()–>自定义错误类型

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
28
 
func Dingyierr(){
callconfig()
fmt.Println("callconfig的函数以及下面的代码!")

}


//函数去读取配置文件config。int的信息
//如果文件名不正确就是返回错误
func readconfig(name string )(err error){
if name=="config.ini"{
return nil
}else {
return errors.New("读取文件错误...") //自定义错误内容事项
}
}


//调用上面的函数readconfig()
func callconfig(){
err:=readconfig("config2.ini")
if err!=nil{
//如果读取文件发送错误,就是输出这个错误,并终止程序
panic(err) //panic后,就是终止了程序继续执行了!!!
}
fmt.Println("callconfig继续执行。。。。")
}
坚持原创技术分享,您的支持将鼓励我继续创作.