Golang 错误处理方式记录
最近在研究golang 发现go并不存在类似java的try catch finally 异常处理机制,这里记录一下go的错误处理方式
测试代码
- 代码
package main
import "fmt"
func test1() {
fmt.Println("test1: Before define deffer")
defer func() { //定义错误处理
fmt.Println("deffer: begin")
err := recover() //获取错误信息
fmt.Printf("recover: type=[%T] error=[%s]\r\n", err, err)
fmt.Println("deffer: end")
}()
fmt.Println("test1: After define deffer")
fmt.Println("test1: Before panic")
panic("panic Error") //抛出错误
fmt.Println("test1: After panic") //不会执行
}
func main() {
fmt.Println("main: Before call test1")
test1()
fmt.Println("main: After call test1")
}
- 得到的输出
main: Before call test1
test1: Before define deffer
test1: After define deffer
test1: Before panic
deffer: begin
recover: type=[string] error=[panic Error]
deffer: end
main: After call test1
总结
- deffer 后的语句不会马上执行,是在函数将要执行结束前执行的
- go 使用recover()函数获取当前触发的
“异常”
- go 使用panic()函数主动抛出一个
"异常"
- 即使函数运行过程中没有发生任何异常,deffer后的语句依然会在函数结束前执行,但使用recover获取到的错误信息是
nil
例如:将上例中panic注释后得到的输出为
main: Before call test1
test1: Before define deffer
test1: After define deffer
test1: Before panic
test1: After panic //此处由于panic不存在 故该行也执行了
deffer: begin
recover: type=[<nil>] error=[%!s(<nil>)] //recover获取到的数据为nil
deffer: end
main: After call test1
- recover函数获取到的数据类型是
string