021_go语言中的异常处理

代码演示

package main

import (
	"errors"
	"fmt"
)

// Go语言里面约定错误代码是函数的最后一个返回值,
// 并且类型是error,这是一个内置的接口
func f1(arg int) (int, error) {
	if arg == 42 {

        // errors.New使用错误信息作为参数,构建一个基本的错误
		return -1, errors.New("cant't work with 42")
    }
    
    // 返回错误为nil表示没有错误
	return arg + 3, nil
}

// 你可以通过实现error接口的方法Error()来自定义错误
// 下面我们自定义一个错误类型来表示上面例子中的参数错误
type argError struct {
	arg  int
	prob string
}

func (e *argError) Error() string {
	return fmt.Sprintf("%d - %s", e.arg, e.prob)
}

func f2(arg int) (int, error) {
	if arg == 42 {

		// 这里我们使用&argError语法来创建一个新的结构体对象,
		// 并且给它的成员赋值
		return -1, &argError{arg, "can't work with it"}
	}

	return arg + 3, nil
}

func main() {

	// 下面的两个循环例子用来测试我们的带有错误返回值的函数
	// 在for循环语句里面,使用了if来判断函数返回值是否为nil是
	// Go语言里面的一种约定做法。
	for _, i := range []int{7, 42} {
		if r, e := f1(i); e != nil {
			fmt.Println("f1 failed:", e)
		} else {
			fmt.Println("f1 worked:", r)
		}
	}

	for _, i := range []int{7, 42} {
		if r, e := f2(i); e != nil {
			fmt.Println("f2 failed:", e)
		} else {
			fmt.Println("f2 worked:", r)
		}
	}

	// 如果你需要使用自定义错误类型返回的错误数据,你需要使用类型断言
	// 来获得一个自定义错误类型的实例才行。
	_, e := f2(42)
	if ae, ok := e.(*argError); ok {
		fmt.Println(ae.arg)
		fmt.Println(ae.prob)
	}
}

代码运行结果

f1 worked: 10
f1 failed: cant't work with 42
f2 worked: 10
f2 failed: 42 - can't work with it
42
can't work with it

代码解读:

  • 错误一般是最后一个返回值,并且是一个内建的接口,是error类型
  • 可以用errors.New构造一个使用给定的错误信息的error值
  • 如果没有错误值的话,返回用nil表示
posted @ 2018-04-02 19:22  Joestar  阅读(160)  评论(0编辑  收藏  举报