zoukankan      html  css  js  c++  java
  • 【GoLang】panic defer recover 深入理解

    唉,只能说C程序员可以接受go的错误设计,相比java来说这个设计真的很差劲!

    我认为知乎上说的比较中肯的:

    1. The key lesson, however, is that errors are values and the full power of the Go programming language is available for processing them.

    2. Use the language to simplify your error handling.

    But remember: Whatever you do, always check your errors!

    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://xiaorui.cc/2016/03/09/%E5%85%B3%E4%BA%8Egolang%E7%9A%84panic-recover%E5%BC%82%E5%B8%B8%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86/

    http://www.linuxidc.com/Linux/2013-04/83105.htm

    http://blog.csdn.net/wuwenxiang91322/article/details/9042503

     https://www.zhihu.com/question/27158146

  • 相关阅读:
    Linux常用命令英文全称与中文解释
    输入一个URL之后发生了什么?
    四种基本的数据结构
    关于深拷贝
    TCP的三次握手和四次挥手
    利用正则表达式去掉字符串的前后空格
    用canvas画一个等腰三角形
    三种隐藏元素方法的区别
    消息中间件-activemq安全机制
    Netty学习(十)-Netty文件上传
  • 原文地址:https://www.cnblogs.com/junneyang/p/6078810.html
Copyright © 2011-2022 走看看