Golang学习笔记 //错误处理

golang cyanprobe 8年前 (2016-07-23) 3450次浏览 已收录 0个评论

前言:

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中的面向对象编程,前面有些 点没弄清楚,用点时间钻好牛角尖 = = 。


CyanProbe , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Golang学习笔记 //错误处理
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址