GoLang 基础语法(十一)
1.错误error
func main() {
err1 := errors.New("自己创建的错误")
fmt.Println(err1)
fmt.Printf("%T\n", err1)
err2 := fmt.Errorf("错误码%d\n", 101)
fmt.Println(err2)
fmt.Printf("%T\n", err2)
fmt.Println("-----------------------")
if err3 := CheckAge(20); err3 != nil {
fmt.Println(err3)
return
} else {
fmt.Println("年龄检测成功!")
}
}
func CheckAge(age int) error {
if age < 0 {
return errors.New("年龄小于0!!!")
}
return nil
}
2.错误类型表示(一)
func main() {
f, err1 := os.Open("test.txt")
if err1 != nil {
fmt.Println(err1)
if ins, ok := err1.(*os.PathError); ok {
fmt.Println(ins.Err)
fmt.Println(ins.Path)
fmt.Println(ins.Op)
}
return
}
fmt.Println(f.Name())
}
3.错误类型表示(二)
func main() {
address, err := net.LookupHost("baidudddd123313dd123.com")
if err != nil {
if ins, ok := err.(*net.DNSError); ok {
if ins.IsTimeout {
fmt.Println("超时错误")
} else if ins.IsTemporary {
fmt.Println("临时错误")
} else {
fmt.Println("通常错误")
}
}
return
}
fmt.Println(address)
}
4.错误类型表示(三)
import (
"fmt"
"path/filepath"
)
func main() {
value, err := filepath.Glob("[")
if err != nil && err == filepath.ErrBadPattern {
return
}
fmt.Println(value)
}
5.自定义错误(一)
func main() {
s, err := CircleArea(-2.23)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("圆形的面积是:", s)
}
type AreaError struct {
msg string
radius float64
}
func (a *AreaError) Error() string {
return fmt.Sprintf("半径:%v,消息:%s\n", a.radius, a.msg)
}
func CircleArea(radius float64) (float64, error) {
if radius < 0 {
return 0, &AreaError{msg: "半径是非法的", radius: radius}
}
return math.Pi * radius * radius, nil
}
6.自定义错误(二)
func main() {
s, err := RectArea(-3, -4)
if err != nil {
if ins, ok := err.(*MyAreaError); ok {
if !ins.LengthOk() {
fmt.Printf("error :长度:%.f,小于零\n", ins.length)
}
if !ins.WightOk() {
fmt.Printf("error :宽度:%.f,小于零\n", ins.weight)
}
}
return
}
fmt.Println(s)
}
type MyAreaError struct {
msg string
length float64
weight float64
}
func (m *MyAreaError) Error() string {
return m.msg
}
func (m *MyAreaError) LengthOk() bool {
return m.length > 0
}
func (m *MyAreaError) WightOk() bool {
return m.weight > 0
}
func RectArea(length float64, weight float64) (float64, error) {
msg := ""
if length < 0 {
msg = "长度小于0"
}
if weight < 0 {
if msg == "" {
msg = "宽度小于0"
} else {
msg += ",宽度小于0"
}
}
if msg != "" {
return 0, &MyAreaError{msg: msg, length: length, weight: weight}
}
return length * weight, nil
}
7.panic和recover
func main() {
FuncA()
defer MyPrint("defer main(): 3...")
FuncB()
defer MyPrint("defer main(): 4...")
fmt.Println("main(): over")
}
func FuncA() {
fmt.Println("我是一个函数FuncA......")
}
func FuncB() {
defer func() {
if msg := recover(); msg != nil {
fmt.Println("FuncB 恐慌恢复了")
}
}()
fmt.Println("我是一个函数FuncB......")
defer MyPrint("defer FuncB(): 1...")
for i := 0; i < 10; i++ {
fmt.Println("i:", i)
if i == 5 {
panic("FuncB 恐慌了")
}
}
defer MyPrint("defer FuncB(): 2...")
}
func MyPrint(s string) {
fmt.Println(s)
}