首页 >后端开发 >Golang > 正文

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

转载2020-01-15 17:33:060830

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中文网其它相关文章!

php中文网最新课程二维码
  • 相关标签:Go语言
  • 本文转载于:博客园,如有侵犯,请联系a@php.cn删除
  • 相关文章

    相关视频


    网友评论

    文明上网理性发言,请遵守 新闻评论服务协议

    我要评论
  • Go中,使用多值返回来返回错误。不要用代替错误,更不要用来控制流程。
    Go是Google开发一种静态强类型、编译型、并发型,并具有垃圾回收功能编程Go接近C,但对于变量声明有所不同。本文就来为大家一下gojson数据
    本文由java入门栏目为大家java中式有哪几种,希望可以帮助到大家。java中主要有两种式:一种是“try catch”,另一种是“throws”。
    go接口在go编程里面用十分频繁,尤其是空接口使用,因为有了接口,才使得Go变得强大。 go教程栏目就来为大家一下Go接口interface
    java入门教程:本文为大家,具有一定参考价值,希望可以帮助到大家。分为:1、抛出;2、捕获。
    本文来自java入门程序,文中为大家了java中句,具有一定参考价值,希望可以帮助到大家。java中使用try-catch句来
    就是有态,和正情况不一样,有错误出错。在java中,阻止当前或作用域情况,称之为。本文为大家详细了java中式。
    go网络编程主要通过net包实现,net包提供了网络I/O接口,包括HTTP、TCP/IP、UDP、域名解析和Unix域socket等。本文go网络编程与http流程详情。
    golang有许多优秀第三库,在我们使用go编程时经会用到第三库,下面就来由go教程栏目来为大家一下安装go第三
    错误,可以解程序本身错误,例如错误。而则更偏向于程序运行不符合预期或者不符合正流程;对于 PHP 错误和使用机制完全不同,因此很容易让人产生困惑。
    即阻止当前或作用域继续执行问题。java之所以要提出机制,就是要告诉开发人员,你程序出现了不正情况,请注意。本文为大家详细了java中机制。
    Go是一门全新静态类型开发,具有自动垃圾回收,丰富内置类型,函数多返回值,错误,匿名函数,并发编程,反射等特性。本教程为大家goGOROOT、GOPATH、GOBIN。
    Go是一个开源编程,它能让构造简单、可靠且高效软件变得容易。本文为大家了一些go使用时经会遇到问题和解决
    Go中接口interface和其他接口没什么区别。interface解为一种类型规范或者约定。本文通过实例为大家go接口定义与使用和Go中interface
    Go是一个开源编程,它能让构造简单、可靠且高效软件变得容易。go教程栏目就来为大家一下go中操作MySQL数据库
    在Java中,throw和throws区别是:1、throws用来声明一个可能产生所有,不做任何;throw用来抛出一个具体类型。
    Go是Google开发一种静态强类型、编译型、并发型,并具有垃圾回收功能编程。下面就来由go入门教程栏目为大家一下使用GVM管Go版本
    PHP即“超文本预器”,是一种通用开源脚本。PHP是在服务器端执行脚本,与C类似,是网站编程。本文就来为大家一下开启PHP服务
    PHP即“超文本预器”,是一种通用开源脚本。是网站编程。本文就来为大家php中两种获取文件夹中文件
    go中通过import关键字引入包、go函数是基本代码块,用于执行一个任务、go变量可以使用var定义。本文通过实例为大家了使用go包引入、函数、变量

    专题推荐

    推荐视频教程
  • Go编程基础视频教程Go编程基础视频教程
  • Go参考手册Go参考手册
  • Go 中文开发手册Go 中文开发手册
  • go语言基础与基本函数go语言基础与基本函数
  • 视频教程分类