一、error基本使用
package mainimport ("errors""fmt"
)
type NetError struct {errorIsLink bool IsAddr bool
}
type MyError struct {code intmsg string
}func (e MyError) Error() string {return e.msg
}func (e MyError) IsLink() bool {return true
}func (e MyError) IsAddr() bool {return true
}var ErrNotFound = errors.New("not found")func main() {data, err := Find(1)data1, err1 := Find(2)if err != nil && !errors.Is(err, ErrNotFound) {return}if data == 0 {}if e, ok := err1.(*MyError); ok && e.IsLink() && e.IsAddr() {fmt.Println(err1.(*MyError).msg, data1)}fmt.Println("程序结束")
}func do() error {return errors.New("test err")
}func Find(id int) (int, error) {if id == 1 {return 0, ErrNotFound}if id == 2 {return 2, &MyError{code: -20001,msg: "id不能为2",}}return id, nil
}
二、panic使用
package mainimport ("fmt""runtime""time"
)func main() {go func() {defer func() {if err := recover(); err != nil {fmt.Println("err = ", err)const size = 64 << 10buf := make([]byte, size)buf = buf[:runtime.Stack(buf, false)]fmt.Printf("Stack trace:\n%s\n", buf)}}()var names []stringfmt.Println(names[0])}()time.Sleep(time.Second * 10)
}