Go 语言基础——错误处理
原创
©著作权归作者所有:来自51CTO博客作者super彦的原创作品,请联系作者获取转载授权,否则将追究法律责任
学习目标
掌握错误处理
掌握自定义错误处理
掌握defer关键字的使用
错误处理
GO没有异常处理机制
Go语言引入了一个关于错误处理的标准模式,即error接口,该接口的定义如下:type error interface {
Error() string
}
实例
可以通过errors.New快速创建错误实例
语法格式:
import "errors"
//n表示函数正常执行后返回的结果,err代表出错后返回的错误信息
func Foo(param int)(n int, err error) {
// ...
}
//调用时的代码建议按如下方式处理错误情况:
n, err := Foo(0)
if err != nil {
// 错误处理
} else {
// 使用返回值n
}
自定义error类型
defer关键字
- 类似于Java中的finally,在退出方法钱会执行defer修饰的语句
- 一个函数中可以存在多个defer语句
- defer语句的调用是遵照 先进后出的原则,即后一个defer语句将先被执行。
func CopyFile(dst, src string) (w int64, err error) {
srcFile, err := os.Open(src)
if err != nil {
return
}
defer srcFile.Close()
dstFile, err := os.Create(dstName)
if err != nil {
return
}
defer dstFile.Close()
return io.Copy(dstFile, srcFile)
}
painc与recover
panic用于不可以恢复的错误
panic退出前会执行defer指定的内容
错误恢复
func TestPanicVxExit(t *testing.T) {
defer func() {
if err := recover(); err != nil {
fmt.Println("错误恢复 ", err)
}
}()
fmt.Println("开始")
panic(errors.New("出现错误!"))
//os.Exit(-1)
fmt.Println("结束")
}
os.Exit 退出
os.Exit直接终止程序不会调用defer指定的函数
os.Exit退出时不会输出当前用调用栈信息