golang error,panic,recover

error

Go中的错误也是一种类型,错误用内置的error类型表示,error是一种接口类型,错误的值可以存在变量中

如果一个函数或方法返回一个错误,那个按照惯例,它必须是函数返回的最后一个值

处理错误的管用方法是将返回的错误与nil进行比较,nil值表示没发生错误,反之有错误

package main

import (
	"fmt"
	"os"
)

func main() {
	file, err := os.Open("test.txt")
	if err != nil{
		//log.Fatal(err)
		fmt.Println(err)
        
        //通过类型断言获取错误类型中的字段信息
		if ins,ok := err.(*os.PathError);ok{
			fmt.Println(ins.Op)
			fmt.Println(ins.Err)
			fmt.Println(ins.Path)
		}
		return
	}
	name := file.Name()
	fmt.Println(name)
}

错误类型表示

error是一个带有Error()方法的接口类型

type error interface{
    Error() string
}

它包含一个带有Error()字符串的方法,任何实现这个接口的类型都可以作为一个错误使用,这个方法提供了对错误的描述

如fmt.Println函数在内部调用Error()方法来获取错误描述,将错误打印出来

创建错误的方式

1.errors包

err := errors.New("自定义错误")

2.fmt包

err2 := fmt.Errorf("自定义错误%d", 404)

案例

package main

import (
	"errors"
	"fmt"
)

func main() {
	err1 := errors.New("自定义错误1")
	fmt.Println(err1)
	fmt.Printf("%T\n",err1)  // *errors.errorString

	err2 := fmt.Errorf("自定义错误%d", 404)
	fmt.Println(err2)
	fmt.Printf("%T\n",err2)  // *errors.errorString
}

函数返回错误类型

package main

import (
	"errors"
	"fmt"
)

func main() {
    //案例
	err := checkAge(-10)
	if err != nil{
		fmt.Println(err)
	}

}

func checkAge(age int) error {
	if age < 0{
		err := errors.New("年龄不合法")
		return err
	}
	fmt.Println("年龄是:",age)
	return nil
}

自定义错误类型

package main

import (
	"fmt"
	"math"
)

func main() {
	//求圆的面积
	//var r = 3.0
	var r = -3.0
	area, err := circleArea(r)
	if err != nil{
		fmt.Println(err)
		return
	}
	fmt.Println(area)
}

//1.定义一个结构体,表示错误的信息
type areaError struct {
	msg string
	radius float64
}
//2.结构体实现error接口中的Error方法
func (e *areaError) Error() string {
	return fmt.Sprintf("error:半径是%.2f,%s",e.radius,e.msg)
}

func circleArea(radius float64) (float64,error) {
	if radius < 0{
		return 0,&areaError{"半径非法",radius}
	}
	return math.Pi *radius * radius, nil
}

panic

panic使程序抛出错误,终止运行

若函数中有panic与defer,在panic之前的defer会执行,panic之后的defer不执行

package main

import "fmt"

func main() {
	test()
}
func test()  {
	defer fmt.Println("test() 001")
	for i:=0; i<=5;i++ {
		fmt.Println(i)
		if i == 3{
			panic("错误,恐慌")
		}
	}
	defer fmt.Println("test() 002")
}
>>>:
test() 001
panic: 错误,恐慌

recover

用来捕获panic,是程序继续运行,recover返回的是panic中的内容

package main

import "fmt"

func main() {
	defer fmt.Println("main() 001")
	test()
	defer fmt.Println("main() 002")
}
func test()  {
	defer fmt.Println("test() 001")
	defer func() {
		if msg := recover();msg!=nil{
			fmt.Println(msg,"程序恢复执行")
		}
	}()
	for i:=0; i<=5;i++ {
		fmt.Println(i)
		if i == 3{
			panic("错误,恐慌")
		}
	}
	defer fmt.Println("test() 002")
}
>>>:
0
1
2
3
错误,恐慌 程序恢复执行
test() 001
main() 002
main() 001

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值