Go 错误处理 Panic 和 Recover
- Go 中没有错误机制
- error 类型实现了 error 接口
1 2 3
| type error interface { Error() string }
|
- 可以通过 errors.New 来实现快速创建错误信息
Panic 的基本定义和使用
- panic 用于不可以恢复的错误
- Panic 退出前会执行 defer 指定的内容、
1 2 3 4 5 6 7 8 9 10 11 12 13
| func TestPanic(t *testing.T) { defer func() { fmt.Println("最后结果依旧执行!") }() fmt.Println("执行开始") panic(errors.New("错误信息!")) }
开始 最后结果依旧执行! --- FAIL: TestPanic (0.00s) panic: 错误信息! [recovered] panic: 错误信息!
|
os.Exit 的基本定义和使用
- os.Exit 退出时不调用 defer 指定的函数
- os.Exit 退出时不输出当前调用栈信息
1 2 3 4 5 6 7 8 9 10 11
| func TestExit(t *testing.T) { defer func() { fmt.Println("这段代码不会执行!") }() fmt.Println("开始执行") os.Exit(-1) // 直接退出 exit status 255 } // 输出结果如下 开始执行 exit status 255
|
Recover 的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| func TestRecover(t *testing.T) {
defer func() { if err := recover(); err != nil { fmt.Println("recoverd 开始\n", err) } }() fmt.Println("开始执行") panic(errors.New("错误信息!")) }
开始执行 recoverd 开始 错误信息!
|
异常处理总结
当一个函数在执行过程中出现了异常或遇到 panic(),正常语句就会立即终止,然后执行 defer 语句,再报告异常信息,最后退出。如果在 defer 中使用了 recover() 函数,则会捕获错误信息,使该错误信息终止报告。