• Golang中的panic和recover(捕获异常)


    func panic(interface{})和func recover() interface{}是Golang中用于错误处理的两个函数。

    panic的作用就是抛出一条错误信息,从它的参数类型可以看到它可以抛出任意类型的错误信息。在函数执行过程中的某处调用了panic,则立即抛出一个错误信息,同时函数的正常执行流程终止,但是该函数中panic之前定义的defer语句将被依次执行。之后该goroutine立即停止执行。

    recover()用于将panic的信息捕捉。recover必须定义在panic之前的defer语句中。在这种情况下,当panic被触发时,该goroutine不会简单的终止,而是会执行在它之前定义的defer语句。

    下面是一个简单的例子:

    -->捕捉自己设置的panic错误:

    package main
    
    import "fmt"
    import "math"
    
    func foo(a int) {
        defer fmt.Println("foo退出来了")
    
        defer func() {
    
            if r := recover(); r != nil {
                fmt.Printf("捕获到的错误:%s
    ", r)
            }
        }()
    
        if a < 0 {
    
            panic("必须输入大于0的数")
        }
    
        fmt.Println("该数的方根为:", math.Sqrt(float64(a)))
    
    }
    
    func main() {
    
        var a int
        a = 10
        fmt.Printf("a=%d
    ", a)
        foo(a)
    
        var b int
        b = -10
        fmt.Printf("b=%d
    ", b)
        foo(b)
    
        fmt.Println("该goroutine还可以执行")
    }
    // ///////////
    a=10
    该数的方根为: 3.1622776601683795
    foo退出来了
    b=-10
    捕获到的错误:必须输入大于0的数
    foo退出来了
    该goroutine还可以执行
    
    Process finished with exit code 0

    ----

    --> 捕捉go语言内部的Panic错误:

    package main
    
    import "fmt"
    
    func foo() {
    
        defer func() {
    
            if r := recover(); r != nil {
                fmt.Printf("捕获到的错误:%s
    ", r)
            }
        }()
    
        var a, b int
    
        a, b = 1, 1
        c := 3/(a-b)
        fmt.Println(a, b, c)
    
    }
    
    func main() {
        foo()
    }
    
    //====
    捕获到的错误:runtime error: integer divide by zero
  • 相关阅读:
    还是不能偷懒ForEach陷阱
    备忘ForEach方法与foreach迭代器使用小区别
    备忘反射调用Private方法
    机器人也会梦见电子羊吗
    Windows 7 下Skype最小化到系统托盘
    编译Boost_1_37_0 For VS2008
    使用API判断网络是否连通(InternetGetConnectedState / IsNetworkAlive)
    SVN中“txncurrentlock:拒绝访问”错误
    幂函数的非递归算法
    Visual Studio中的文件类型(sln vcproj suo user ncb)
  • 原文地址:https://www.cnblogs.com/zhzhlong/p/9486794.html
Copyright © 2020-2023  润新知