kaisawind's blog
  • 关于
  • 所有帖子

Go语言异常处理defer,panic,recover - Tue, Feb 19, 2019

为什么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栈之后继续进行。


辽ICP备2021007608号 | © 2025 | kaisawind

Facebook Twitter GitHub

▄