Go中的异常处理机制
- Go没有Java那样的try/catch机制,不能向上抛出异常,但是有自己的一套defer - panic - recover机制
- try/catch机制从底层往高层抛出异常耗费资源
- Go中处理错误是通过在函数和方法中返回错误对象作为它们唯一或者最后一个返回值,如果返回nil,表示没有错误
panic - recover来处理异常
- recover函数用于从panic或错误场景中恢复,可以让程序从panicking重新获取控制权,停止终止程序的过程,恢复程序正常执行
类似于Java的catch代码块
- recover只能在defer修饰的函数中使用,用于获取panic调用中传递的错误值(在别的地方调用,返回nil)
- panic会导致方法调用栈被展开,直到defer修饰的recover()被调用或者程序终止
自定义包中的异常处理
- 在包内部,总是应该从panic中recover,不允许显示地超出包范围的panic()
- 应该向包的调用者返回错误值,而不是panic
通过闭包处理错误
defer - panic - recover机制 + 闭包,可以提供一种更加优雅的方式处理错误(仅适用于所有函数都是同一种签名)
func errorHandler(fn fType1) fType1 {
return func(a type1, b type2) {
defer func() {
if err, ok := recover().(error); ok {
log.Printf("run time panic: %v", err)
}
}()
fn(a, b)
}
}
单元测试
- 测试程序必须属于被测试的包,并且文件名满足*_test.go
- 测试程序不会被普通的Go编译器编译,可以通过gotest编译普通程序和测试程序
- 测试程序必须导入“testing”包,测试程序内,函数名字为"TestZzz"形式
如:TestFmtInterface,TestPayEmployees等
- 测试函数的形式:func TestAbcde(t *testing.T)
T 是传给测试函数的结构类型,用来管理测试状态,支持格式化测试日志,如 t.Log,t.Error,t.ErrorF 等
- 测试失败可调用函数
- func (t *T) Fail() 标记测试函数为失败,然后执行余下测试
- func (t *T) FailNow() 标记测试函数为失败并且中止执行;文件内的其他测试函数也会被略过,继续执行下一个文件的测试函数
- func (t *T) Log(args ...interface{}) 打印错误日志
- func (t *T) Fatal(args ...interface{}) 相当于限制性Log(),然后执行FailNow()
分析优化
使用gotest,通过参数 -cpuprofile 和 -memprofile可以向指定文件写入CPU和内存使用情况
go test -x -v -cpuprofile=prof.out -file x_test.go
入门教程推荐: github.com/Unknwon/the…