错误处理
在 Go 语言中,定义了 error 类型,来显示的表达错误,错误作为函数的返回值进行返回。
Error 类型
error 类型是一个接口类型:
1 | type error interface { |
可以通过 errors.New 把一个字符串转化为 errorString,以得到一个 error 对象:
1 | // errorString is a trivial implementation of error. |
自定义 Error
error 因为是一个接口,所以可以通过实现 error 接口,自定义错误类型。如 json.SyntaxError 类型,除了错误描述外,还定义了错误发生的位置:
1 | type SyntaxError struct { |
再如 net.Error 类型,定义了更复杂的错误处理,判断是否超时、或者临时性错误:
1 | type Error interface { |
可以通过类型断言,获取自定义的错误类型:
1 | serr, ok := err.(*json.SyntaxError) |
异常
Go 语言中,将异常与错误区分开来:
- 错误指可以预期的错误,这时可以将错误当作函数返回值返回。
- 异常指无法预期、无法继续执行的严重程序错误,如数组地址越界。
异常恢复机制
Go 语言中可以使用 recover
机制来恢复异常:
1 | defer func(){ |
测试
编写测试用例
测试文件必须遵循如下原则:
- 文件名必须是
_test.go
结尾的。 - 必须
import testing
。 - 所有的测试函数的格式为
func TestXxx (t *testing.T)
。 - 通过调用
testing.T
的Error
,Errorf
,FailNow
,Fatal
,FatalIf
方法,说明测试不通过,调用Log
方法用来记录测试的信息。
如编写 go 文件 gotest.go
:
1 | package gotest |
编写相应的测试文件 gotest_test.go
:
1 | package gotest |
执行测试文件可以得到以下结果:
1 | === RUN TestDivide_1 |
压力测试
压力测试用来测试函数的性能,需要注意:
- 压力测试函数的格式为
func BenchmarkXXX(b *testing.B)
。 go test
不会默认执行压力测试的函数,如果要执行压力测试需要带上参数-test.bench
,语法:-test.bench="test_name_regex"
。
对上述编写的除法函数进行压力测试:
1 | func BenchmarkDivide(b *testing.B) { |
可以通过调用 b.StopTimer()
和 b.StartTimer()
暂停和开始时间计数。执行结果如下:
1 | goos: windows |