您现在的位置是:群英 > 开发技术 > 编程语言
Go语言中异常处理方法是什么,正确处理是怎样的
Admin发表于 2022-07-09 17:43:37872 次浏览
这篇文章给大家分享的是“Go语言中异常处理方法是什么,正确处理是怎样的”,文中的讲解内容简单清晰,对大家学习和理解有一定的参考价值和帮助,有这方面学习需要的朋友,接下来就跟随小编一起学习一下“Go语言中异常处理方法是什么,正确处理是怎样的”吧。

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语言中异常处理方法是什么,正确处理是怎样的”已经有了进一步的了解,更多相关的问题,欢迎关注群英网络或到群英官网咨询客服。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: 异常处理
相关信息推荐
2022-12-09 17:50:23 
摘要:4种方法:1、用ltrim()去除字符串左侧的回车符,语法“ltrim(字符串)”;2、用rtrim()去除字符串右侧的回车符,语法“rtrim(字符串)”;3、用trim()去除字符串两侧的回车符,语法“trim(字符串)”;4、用preg_replace()配合正则表达式来去除全部回车符,语法“preg_replace('/\r|\n/','',字符串)”。
2022-09-16 17:55:44 
摘要:RN ui框架有:1、React Native Elements,遵循Material Design原则,用户可以根据要求对组件进行建模,完全控制应用程序设计;2、lottie-react-native,一个非常轻量级同时又支持多平台的动画库;3、NativeBase,支持丰富广泛的生产级UI组件;4、Teaset,专注于内容展示和操作控制,可大大改善页面开发效率。
2022-07-04 17:24:47 
摘要:这篇文章主要为大家介绍了Go语言基础go fmt命令的使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部