Go语言错误处理

go语言中使用error接口处理异常,两个内置函数panic()和recover()以报告和处理运行时错误和程序中的错

误场景,一个defer关键字来处理顺序执行。

一、error异常处理

01、error接口

go语言使用接口error处理异常。

type error interface { 
 Error() string
}

该接口处于errors包下,只有以下内容:

package errors
func New(text string) error { return &errorString{text} }
type errorString struct { text string }
func (e *errorString) Error() string { return e.text }

02、New()函数

可以直接使用New函数定义一个错误数据:

func main() {
	i,err:=walk(5)
	if err==nil{
		fmt.Println(i)
	}

	l,err:=walk(10)
	if err==nil{
		fmt.Println(l)
	}
	fmt.Println(err)
}

func walk(i int)(s string,err error){
	if i<10{
		return "ok",nil
	}
	return "no",errors.New("this is false")
}


//ok
//this is false

03、fmt.Errorf()函数

调用 errors.New 函数是非常稀少的,因为有一个方便的封装函数 fmt.Errorf,它还会处理字符串格式化。

package fmt
import "errors"
func Errorf(format string, args ...interface{}) error {
    return errors.New(Sprintf(format, args...))
}

如下:

func main() {
	errs:=run("hello")
	if errs!=nil{
		fmt.Println(errs)
	}
}

func run(s string)error{
	if len(s)<8{
		return fmt.Errorf("错误,%v数据长度过短",s)
	}
	fmt.Println("ok")
	return  nil
}

//错误,hello数据长度过短

二、defer关键字

defer 关键字将语句延迟执行,在defer所在的函数即将返回或者说结束时,将defer语句执行。

如果有多个被defer修饰的语句,那么以栈(后进先出)的方式执行,即逆序执行。

func main()  {
	//defer关键字用于延迟执行
	fmt.Println("Start do ..")
	defer hello(1)
	defer hello(2)
	defer hello(3)
	fmt.Println("End do..")

}

func hello(i int){
	fmt.Println("Hello",i)

	defer ok(7)//在函数结束前执行
	fmt.Printf("hello%d函数结束啦
",i)
	return
}

func ok(i int)  {
	fmt.Println("yes",i)
}

主函数执行完毕即将结束时,hello()函数从hello(3)开始执行,在hello(3)即将结束时执行ok(7),然后hello(2),hello(1)按照顺序逆序执行。

Start do ..
End do..
Hello 3
hello3函数结束啦
yes 7
Hello 2
hello2函数结束啦
yes 7
Hello 1
hello1函数结束啦
yes 7

三、panic()、recover()函数

Go语言引入了两个内置函数panic()和recover()以报告和处理运行时错误和程序中的错 误场景:

func panic(interface{})

func recover() interface{}

01、panic()

当在一个函数执行过程中调用panic()函数时,正常的函数执行流程将立即终止,但函数中 之前使用defer关键字延迟执行的语句将正常展开执行,错误信息将被报 告,包括在调用panic()函数时传入的参数,这个过程称为错误处理流程。

func main() {

	defer fmt.Println("宕机也要执行的语句")
	defer fmt.Println("宕机之前的defer语句仍然执行")


	panic("错误,宕机")
	defer fmt.Println("宕机之前的语句不再执行")
	fmt.Println("no........")
}

宕机之前的defer语句仍然执行
宕机也要执行的语句
panic: 错误,宕机

goroutine 1 [running]:
main.main()
	E:/GoProject/aone/src/panicdemo.go:10 +0x147

Process finished with exit code 2

02、recover()

recover()函数用于终止错误处理流程。一般情况下,recover()应该在一个使用defer

关键字的函数中执行以有效截取错误处理流程。

func main() {

	defer func() {
		err:=recover()
		fmt.Println("捕获数据:",err)
	}()
	defer fmt.Println("宕机也要执行的语句")
	defer fmt.Println("宕机之前的defer语句仍然执行")


	panic("错误,宕机")
	fmt.Println("no........")

}

宕机之前的defer语句仍然执行
宕机也要执行的语句
捕获数据: 错误,宕机

原文地址:https://www.cnblogs.com/cgl-dong/p/14034882.html