go语言的方法异常与nodejs非常相似,源码包中存在大量的err返回设计
、
如果没有发生错误,返回的错误值将为nil
error
创建错误
err:=errors.New("err")
defer
可以理解为java中的finally。
defer语句经常被用于处理成对的操作,如打开-关闭、连接-断开连接、加锁-释放锁。特别是在执行打开资源的操作时,遇到错误需要提前返回,在返回前需要关闭相应的资源,不然很容易造成资源泄露等问题。
当一个函数有多个延迟调用时,它们被添加到一个堆栈中,并按后进先出(Last In First Out,LIFO)的顺序执行。
panic recover
panic()是一个内建函数,可以中断原有的控制流程
recover()可以让进入恐慌流程的Goroutine(可当作线程理解,后续章节会详细讲解)恢复过来并重新获得流程控制权。需要注意的是,recover()让程序恢复,必须在延迟函数中执行。换言之,recover()仅在延迟函数中有效。
package main
import "fmt"
func main() {
funcA()
funcB()
funcC()
fmt.Println("finish")
}
func funcC() {
defer func() {
fmt.Println("exec defer func")
msg := recover()
fmt.Println("get return value", msg)
}()
}
func funcB() {
defer func() {
if msg := recover(); msg != nil {
fmt.Println(" recover ,get return value", msg)
}
}()
fmt.Println("this is funcB")
for i := 0; i < 10; i++ {
fmt.Println("i:", i)
if i == 5 {
panic("funcB panic")
}
}
}
func funcA() {
fmt.Println("this is funcA")
}