Go语言异常处理defer,panic,recover

  1. 为什么Go没有异常
  2. defer
  3. panic
  4. recover

为什么Golang不使用try-catch-finally进行异常处理?可以参考官方给出的解释
https://golang.org/doc/faq#exceptions

为什么Go没有异常

我们认为将异常耦合到控制结构,就像try-catch-finally一样,会导致代码复杂化。他还会让开发者标记很多普通错误,例如,打开文件失败会被认为是异常的。

Go采用了不同的方法。对于简单的错误处理,Go的多值返回会是程序更容易的抛出一个错误,而不会有返回值过载(一个返回值时,会被赋予过多的含义)。规范的错误类型(不同的error会被认为是不同的类型),结合Go语言的其他特性,会让开发者得心应手的处理错误,但是它与其他语言完全不同。

Go还有一套内建的机制,可以发出信号并从真正的中断中进行恢复。恢复机制只会作为函数发生错误被中断的一部分进行执行(defer之后)。这足以处理灾难级别的错误,但是不需要额外的控制结构。如果用的好的话,会有整洁的代码。

defer

defer类似析构函数,但是defer是动态的,是以栈的形式动态追加的。defer的作用于与变量的作用域是一致的,遵循先入后出原则。

func f() error {
    defer func() {
        fmt.Println("defer\n")
    }

    fmt.Println("function\n")
}
function
defer

panic

panic用来表示非常严重不可恢复的错误。panic可以抛出interface类型。panic之后程序会挂掉,但是程序与不会立刻挂掉,程序会先执行defer,再向上抛出错误。

recover

recover用来恢复panic。
①panic→②defer→③recover
但是recover不会恢复到panic的那个函数栈继续进行,而是在defer栈之后继续进行。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 wind.kaisa@gmail.com

文章标题:Go语言异常处理defer,panic,recover

本文作者:kaisawind

发布时间:2019-02-19, 06:34:20

最后更新:2020-11-18, 15:55:44

原始链接:https://kaisawind.gitee.io/2019/02/18/2019-02-19-golang/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏