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
}