前言:
Golang引入了一个错误处理的标准模式,即error接口,该接口定义为:
正文
type error interface{ Error() string }
对于大多数函数,如果要返回错误,可以用如下的模式,就像之前函数那个例子一样
func Foo(param int)(n int,err error){ //将error作为多种返回值的最后一个 }
defer 关键字
defer关键字是Go引入的一个非常有意思的特征,在c++中如果打开一个文件出现错误,在可能抛出错误的任何地方,都需要把文件句柄关闭。当然,c++已经封装了类方法(表示不会 = = 原话叙述)。还有一种发放可以将资源在函数尾部统一释放资源,函数退出时,必须用goto语句转到指定位置处理,而不能用return语句返回。然而Go使用了defer关键字简简单解决了这个问题。
func CopyFile(dst,sec string)(w int64,err error){ srcFile,err:=os.Open(src) if err !=nil { return } defer srcFile.Close() dstFile,err:=os.Creat(dstName) if err!=nil{ return } defer dstFile.close() return io.Copy(dstFile,srcFile) }
其中Copy抛出错误,而defer会保证dstFile和srcFile被正常关闭,进行清理。可以再defer后面执行一个匿名函数做复杂的清理工作。
panic()和recover()
Go语言引入两个内置函数panic()和recover()用来报告和处理运行中的程序场景
func panic(interface{}) func recover() interface{}
当一个函数执行过程中调用panic()函数时,正常的函数执行过程将被终止,但函数中之前使用defer关键字的延迟执行将正常执行,之后该函数将返回到调用函数,并导致逐层向上执行panic()流程。直到所属的goroutine中所有正在执行的函数被终止。错误信息将被报告,包括在调用panic()函数时传入的参数,这个过程称为错误处理流程。
panic()的参数类型为interface{}从此得知其参数可以使用各种参数 = = 。 recover()函数用于终止错误处理流程。一般情况下,recover()应该在一个使用defer关键字的函数肿么会执行用来有效截取错误。如果没有在发生异常的的goroutine所属的进程打印错误信息后直接退出。下面举一个例子。
defer func(){ if r :=recover();r!=nil;{ log.Print("Runtime error caught : %v",r) //占位符 v默认格式 } }() foo()
无论foo()中是否触发了错误处理流程,该匿名defer函数都会在函数退出时执行,假如在foo()中触发错误处理流程,recover()函数将使得错误处理过程终止。如果错误处理流程被触发,春熙传给panic函数的参数不为nil,该函数还会打印错误信息。
package main import "fmt" //运行 结果为 a c 55 d func main() { defer func() { //必须要先声明defer,否则不能捕获到panic异常 fmt.Println("c") if err := recover(); err != nil { fmt.Println(err) //这里的err其实就是panic传入的内容,55 } fmt.Println("d") }() f() } func f() { fmt.Println("a") panic(55) fmt.Println("b") fmt.Println("f") }
后记
杰西来学习Go中的面向对象编程,前面有些 点没弄清楚,用点时间钻好牛角尖 = = 。