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,则该函数还会打印详细的错误信息。