Fork me on GitHub
随笔 - 215  文章 - 13  trackbacks - 0
<2016年8月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910


专注即时通讯及网游服务端编程
------------------------------------
Openresty 官方模块
Openresty 标准模块(Opm)
Openresty 三方模块
------------------------------------
本博收藏大部分文章为转载,并在文章开头给出了原文出处,如有再转,敬请保留相关信息,这是大家对原创作者劳动成果的自觉尊重!!如为您带来不便,请于本博下留言,谢谢配合。

常用链接

留言簿(1)

随笔分类

随笔档案

相册

Awesome

Blog

Book

GitHub

Link

搜索

  •  

积分与排名

  • 积分 - 204418
  • 排名 - 126

最新评论

阅读排行榜

原文链接:http://xiaorui.cc/?p=2909

Golang这么时尚的语言是没有类似try..catch 这种异常处理机制,而是使用 panic 和 recover处理异常. 其实相当于python的raise。

golang的异常处理组合 panic,defer,recover,跟java中的try catch finially是类似的。 但是从语言的用户体验来说,不怎么好。 但考虑到golang的场景基本是系统高性能层面的,这种精准错误处理应该减少那种后遗症bug。

该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。

http://xiaorui.cc/?p=2909

使用panic抛出异常,抛出异常后将立即停止当前函数的执行并运行所有被defer的函数,然后将panic抛向上一层,直至程序carsh。但是也可以使用被defer的recover函数来捕获异常阻止程序的崩溃,recover只有被defer后才是有意义的。

必须注意:

1.   defer 需要放在 panic 之前定义,另外recover只有在 defer 调用的函数中才有效。
2.   recover处理异常后,逻辑并不会恢复到 panic 那个点去,函数跑到 defer 之后的那个点.
3.   多个 defer 会形成 defer 栈,后定义的 defer 语句会被最先调用

panic (主动爆出异常) 与 recover (收集异常)

recover 用来对panic的异常进行捕获. panic 用于向上传递异常,执行顺序是在 defer 之后。 

我们举个含有异常的例子:

如果你不把这个异常panic recover处理的化,那么就会发生下面的情况.

下面是处理panic的例子. 

那么上面代码的运行结果是:

上面go代码实例中,异常是我们通过panic方法主动抛出来的,但如果真的就出现了未知的异常咋办?

我们可以看到出现的异常会走到defer这一步,defer这里可以打印具体的异常信息,defer运行完之后不能回到原点,控制权会被扔到该函数的外层,也就是调用这个函数的层,对应上面的代码也就是main()函数。

上面go代码运行结果是:


先前没在意defer  recover  panic的注意事项,结果各种问题出现了。 不知道go以后会不会有try catch异常模式, 很是期待… 

END.

交叉参考:http://blog.csdn.net/htyu_0203_39/article/details/50990266

posted on 2017-01-16 16:56 思月行云 阅读(262) 评论(0)  编辑 收藏 引用 所属分类: Golang

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理