【Duke】编写好的错误处理 017 - PingPongGooo/GoFoundation GitHub Wiki

Go的错误机制

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)
}

⚠️ **GitHub.com Fallback** ⚠️