error接口
//定义error接口 type error interface{ Error() string } //调用error接口 func Foo(param int) (n int,err error){ //... } n,err:=Foo(0) if err!=nil{ //错误处理 }else{ //使用返回值 }
panic()和recover()
Go中使用内置函数panic()
和recover()
来处理程序中的错误。
func panic(interface{}) func recover() interface{}
panic()
当函数执行触发了panic()函数时,如果没有使用到defer关键字,函数执行流程会被立即终止;如果使用了defer关键字,则会逐层执行defer语句,直到所有的函数被终止。
错误信息,包括panic函数传入的参数,将会被报告出来。
示例如下:
panic(404) panic("network broken") panic(Error("file not exists"))
recover()
recover()函数用于终止错误处理流程。一般使用在defer关键字后以有效截取错误处理流程。如果没有在发生异常的goroutine中明确调用恢复过程(使用recover关键字) ,会导致该goroutine所属的进程打印异常信息后直接退出。
defer func() { if r := recover(); r != nil { log.Printf("Runtime error caught: %v", r) } }() foo()
无论foo()中是否触发了错误处理流程,该匿名defer函数都将在函数退出时得到执行。假如foo()中触发了错误处理流程, recover()函数执行将使得该错误处理过程终止。如果错误处理流程被触发时,程序传给panic函数的参数不为nil,则该函数还会打印详细的错误信息。