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