Go学习笔记—错误处理

本文详细介绍了Go语言的错误处理机制,包括使用内置的error接口创建错误,自定义错误类型以提供更丰富的错误信息,以及如何通过类型断言获取自定义错误的数据。此外,还探讨了panic和recover的用法,它们用于处理程序运行时的异常情况。通过示例代码展示了如何在函数中使用defer和recover来捕获并处理panic导致的错误。
摘要由CSDN通过智能技术生成

Go学习笔记—错误处理


Go语言使用一个独立的,明确的返回值来传递错误信息。

Go语言的错误处理方式能清楚的知道哪个函数返回了错误,并能像调用那些没有出错的函数一样调用。

内置接口

Go语言中的错误通常是最后一个返回值并且是error类型。error是一个内置的接口。

Go语言中可以使用errors.New构造一个使用给定的错误信息的基本error值。

func f1(arg int) (int,error){
	if arg == 42{
		return -1,errors.New("can't work with 42")  //构造一个指定错误信息的基本error值
	}
	return arg + 3,nil
}

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

//f1 worked: 10
//f1 failed: can't work with 42

在返回的错误信息中,如果返回nil,则代表没有错误。

自定义错误类型

Go语言中可以通过error()方法,来自定义错误类型。

通过与结构体结合,定义符合结构体的方法,来返回错误内容。

type argError struct{
	arg int
	prob string
}

func (e *argError) Error() string{
	return fmt.Sprintf("%d-%s",e.arg,e.prob) 
    //函数的返回值是字符串,所以使用Sprintf函数
}

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

//f2 failed: 10
//f2 worked: 42-can't work with it
  • fmt.Sprintf()
    //Sprintf formats according to a format specifier and returns the resulting string.
    //根据格式说明,返回结果字符串
    

通过定义方法,来返回自定义错误类型。

func f2(arg int) (int,error){
	if arg == 42{
		return -1,&argError{arg,"can't work with it"}
	}
	return arg + 3,nil
}

func main(){
    _,e := f2(42)
	if ae,ok := e.(*argError);ok{
        //类型断言,ok为true才执行语句
		fmt.Println(ae.arg)
		fmt.Println(ae.prob)
	}
}

//42
//can't work with it

这其中使用到类型断言,可以获取自定义错误类型中的数据。

  • //类型断言的格式:
    x.(T)
    
    //x 为自定义类型的实例
    //T 为断言可能存在的类型
    
  • 类型断言返回两个参数,第一个参数是x转化为T类型后的变量,第二个值是一个布尔值,若为true则表示断言成功,为false则表示断言失败。

panic和recover

panicrecover是Go语言的内置函数,用来进行错误处理。

panic意味着有些出乎意料的错误发生。通常我们用它来表示在程序正常运行中出现的不应该出现的,或者没有处理好的错误。

panic可以在任何地方引发,recover只有在defer调用的函数中才有效。

func f3(){
    defer func(){
        err := recover()
        if err != nil{
            fmt.Println("用来测试recover错误处理")
        }
    }()
	panic("用来测试panic错误处理")
}

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

	f3()

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

//f1 worked: 10
//f1 failed: can't work with 42
//panic: 用来测试panic错误处理

//goroutine 1 [running]:
//main.f3(...)
//	E:/GoProjects/StudyGO/0809.go:32
//main.main()
//	E:/GoProjects/StudyGO/0809.go:44 +0x1eb

运行结果显示,程序在运行完f3()后,出现错误。这是因为f3()中的panic导致程序崩溃。

func f3(){
    defer func(){
        err := recover()
        if err != nil{
            fmt.Println("用来测试recover错误处理")
        }
    }()
	panic("用来测试panic错误处理")
}

//在使用panic的函数中,添加defer和recover语句后,函数即可正常运行

//f1 worked: 10
//f1 failed: can't work with 42
//用来测试recover错误处理
//f2 failed: 10
//f2 failed: 42-can't work with it
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值