• 技术文章 >后端开发 >Golang

    Go语言异常处理的方法介绍

    尚2020-01-15 17:33:06转载1098

    php入门到就业线上直播课:进入学习

    Go语言追求简洁优雅,所以,Go语言不支持传统的try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个异常。

    在Go语言中,使用多值返回来返回错误。不要用异常代替错误,更不要用来控制流程。在极个别的情况下,也就是说,遇到真正的异常的情况下(比如除数为 0了)。才使用Go中引入的Exception处理:defer, panic, recover。

    这几个异常的使用场景可以这么简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。

    例子代码:

    package main
    import "fmt"
    func main(){
    
        defer func(){ // 必须要先声明defer,否则不能捕获到panic异常
    
            fmt.Println("c")
    
            if err:=recover();err!=nil{
    
                fmt.Println(err) // 这里的err其实就是panic传入的内容,55
    
            }
    
            fmt.Println("d")
    
        }()
    
        f()
    
    }
    
    func f(){
    
        fmt.Println("a")
    
        panic(55)
    
        fmt.Println("b")
    
        fmt.Println("f")
    
    }
    
    输出结果:
    
    a
    c
    d
    exit code 0, process exited normally.

    defer

    defer 英文原意: vi. 推迟;延期;服从 vt. 使推迟;使延期。

    defer的思想类似于C++中的析构函数,不过Go语言中“析构”的不是对象,而是函数,defer就是用来添加函数结束时执行的语句。注意这里强调的是添加,而不是指定,因为不同于C++中的析构函数是静态的,Go中的defer是动态的。

    func f() (result int) {
      defer func() {
        result++
      }()
      return 0
    }

    上面的函数就返回0了,因为还没来得及添加defer的东西,函数就返回了。

    另外值得一提的是,defer可以多次,这样形成一个defer栈,后defer的语句在函数返回时将先被调用。

    panic

    panic 是用来表示非常严重的不可恢复的错误的。在Go语言中这是一个内置函数,接收一个interface{}类型的值(也就是任何值了)作为参数。panic 的作用就像我们平常接触的异常。

    不过Go可没有try…catch,所以,panic一般会导致程序挂掉(除非recover)。所以,Go语言中的异常,那真的是异常了。你可以试试,调用panic看看,程序立马挂掉,然后Go运行时会打印出调用栈。

    但是,关键的一点是,即使函数执行的时候 panic了,函数不往下走了,运行时并不是立刻向上传递panic,而是到defer那,等defer的东西都跑完了,panic再向上传递。所以这时候 defer 有点类似 try-catch-finally 中的 finally。

    recover

    上面说到,panic的函数并不会立刻返回,而是先defer,再返回。这时候(defer的时候),如果有办法将panic捕获到,并阻止panic传递,那就异常的处理机制就完善了。

    Go语言提供了recover内置函数,前面提到,一旦panic,逻辑就会走到defer那,那我们就在defer那等着,调用recover函数将会捕获到当前的panic(如果有的话),被捕获到的panic就不会向上传递了,于是,世界恢复了和平。你可以干你想干的事情了。

    不过要注意的是,recover之后,逻辑并不会恢复到panic那个点去,函数还是会在defer之后返回。

    更多go语言知识请关注PHP中文网go语言教程栏目。

    以上就是Go语言异常处理的方法介绍的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:博客园,如有侵犯,请联系admin@php.cn删除
    专题推荐:Go语言
    上一篇:golang使用protobuf的方法详解 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • golang解决中文乱码的方法• golang判断错误类型的方法• golang切片需要make吗• win10系统开机卡在logo画面
    1/1

    PHP中文网