在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Go的错误机制
//error类型实现了error接口 type error interface { Error() string }
//可以通过errors.New来快速创建错误实例 errors.New("n must be in the range [0,10]")
最佳实践 emmmmmm,这个在其他的语言应该也是很常见的方式了。
panic vs. os.Exit
defer func() { if err := recover(); err != nil { //恢复错误,recover会获取抛出的err. } }() //Ps:感觉有些像Catch.
最常见的"错误恢复",这种方式其实是很危险的,代码如下: defer func() { if err := recover(); err != nil { log.Error("recoverd panic", err) } }()
当心 recover 成为恶魔
Show the code: 关于Error package error_test import ( "fmt" "errors" "testing" ) //区分错误类型,定义预置错误 var LessThanTwoError = errors.New("n should be not less than 2") var LagerThanHundredError = errors.New("n should be not larger than 100") func GetFibonacci(n int) ([] int, error) { if n < 2 { return nil, LessThanTwoError } if n > 100 { return nil, LagerThanHundredError } fibList := []int{1,1} for i:=2; i<n; i++{ fibList = append(fibList, fibList[i-2] + fibList[i-1]) } return fibList, nil } func TestGetFibonacci(t *testing.T){ if v,err:=GetFibonacci(-10);err != nil{ if err == LessThanTwoError { fmt.Println("Less than 2") } else if err == LagerThanHundredError { fmt.Println("Larger than 100") } }else{ t.Log(v) } } Recover相关: package panic_recover import ( "errors" "testing" "fmt" //"os" ) func TestPanicVxExit(t *testing.T){ defer func() { if err := recover(); err != nil { fmt.Println("recovered from ", err) } }() fmt.Println("Start") panic(errors.New("Something wrong!")) //会输出调用栈信息,并执行defer //os.Exit(-1) //不输出调用栈,不执行defer }
|
请发表评论