go语言中错误的处理和实现自己的错误处理类型

package main

import (
	"errors"
	"fmt"
)

func main() {

	/*
		错误:在可能出现问题的地方出现问题, 如打开一个文件打开失败是意料之中的事情
		异常:在不该出现错误的地方出现错误, 如出现空指针,意料之外的情况
	*/
	//exec.Command("pwd")
	//exec.Command("ps")
	//f, err := os.Open("test.txt")
	//if err != nil {
	//	log.Fatal(err)  // print + exit()
	//	//fmt.Println(err)
	//}
	//fmt.Println(f.Name(), "打开成功.....")
	-------------------
	/*
		error 内置了数据类型,内置的接口
			定义了方法:Error() string
		// The error built-in interface type is the conventional interface for
		// representing an error condition, with the nil value representing no error.
		type error interface {
			Error() string
		}
	*/
	err1 := errors.New("创建测试的错误处理函数")
	fmt.Println(err1)
	fmt.Printf("%T\n", err1)

	//另外一个创建错误的方法
	err2 := fmt.Errorf("错误的信息:%d", 100)
	fmt.Println(err2)
	fmt.Printf("%T\n", err2)

	fmt.Println("--------------------")
	err3 := checkAge(-30)
	if err3 != nil {
		fmt.Println(err3)
		return
	}
	fmt.Println("程序 go on")

	fmt.Println("errno demo")
}
func checkAge(age int) (err error) {
	if age < 0 {
		//return errors.New("年龄不合法")
		err = fmt.Errorf("你给的年龄是%d,不合法", age)
		return
	}
	fmt.Println("年龄是:", age)
	return nil
}

自定义结构体中实现对错误接口的实现
可以看到error接口中只有Error一个函数
areaError实现了Error函数,那么按照接口的特性,

func main() {
	radius := -3.8
	area, err := circleArea(radius)
	if err != nil {
		//err.Error()
		// err 是error接口类型,那么Println(err)中会调用 func (e *areaError) Error() string 
		// 并输出 areaError结构体的信息,有助于查看出错的原因
		fmt.Println(err)
		return
	}
	fmt.Println("圆形的面积是:", area)
	fmt.Println("errno demo")
}
package main

import (
	"fmt"
	"math"
)

func main() {
	radius := -3.8
	area, err := circleArea(radius)
	if err != nil {
		//err.Error()
		fmt.Println(err)
		return
	}
	fmt.Println("圆形的面积是:", area)
	fmt.Println("errno demo")
}

// 定义一个结构体,表示错误的类型
type areaError struct {
	msg    string
	redius float64
}

// 实现error接口,就是实现error方法
func (e *areaError) Error() string {
	return fmt.Sprintf("error:半径是, %.2f,%s", e.redius, e.msg)
}

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Achilles.Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值