【Duke】编写好的错误处理 017 - PingPongGooo/GoFoundation GitHub Wiki
Go语言作为现代的编程语言,竟然没有异常机制 三位创始人,认为try catch finnaly 的随意使用。对代码影响很大。
与其他编程语言的差异
1. 没有异常机制
2. error类型实现了 error接口
3. 可以通过 errors.New 来快速创建错误实例
type error interface{
Error() string
}
errors.New("n must be in the range[0,10]")
package error
import (
"errors"
"testing"
)
func GetFibonacci2(n int) ([]int,error) {
if n < 0 || n > 100{
return nil,errors.New("n should be in [2,100]")
}
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 := GetFibonacci2(10); err !=nil{
t.Log(err)
}else {
t.Log(v)
}
}
package error
import (
"errors"
"fmt"
"testing"
)
var LessThanTwoError = errors.New("n should be not less than 2")
var LargeThenHundreError = errors.New("n should be not larger than 100")
func GetFibonacci2(n int) ([]int,error) {
if n < 2{
return nil,LessThanTwoError
}
if n > 100{
return nil,LargeThenHundreError
}
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 := GetFibonacci2(10); err !=nil{
if LessThanTwoError == err{
fmt.Println("It is less.")
}
t.Error(err)
}else {
t.Log(v)
}
}
尽早失败,避免嵌套
func GetFibonacci3(str string) {
var (
i int
err error
list []int
)
if i,err = strconv.Atoi(str); err!= nil{
fmt.Println("Error", err)
return
}
if list,err = GetFibonacci2(i); err!= nil{
fmt.Println("Error", err)
return
}
fmt.Println(list)
}