一、error基本使用
package main
import (
"errors"
"fmt"
)
type NetError struct {
error
IsLink bool
IsAddr bool
}
type MyError struct {
code int
msg 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 main
import (
"fmt"
"runtime"
"time"
)
func main() {
go func() {
defer func() {
if err := recover(); err != nil {
fmt.Println("err = ", err)
const size = 64 << 10
buf := make([]byte, size)
buf = buf[:runtime.Stack(buf, false)]
fmt.Printf("Stack trace:\n%s\n", buf)
}
}()
var names []string
fmt.Println(names[0])
}()
time.Sleep(time.Second * 10)
}