Go语言——error、panic

发布于:2025-05-08 ⋅ 阅读:(20) ⋅ 点赞:(0)

一、error基本使用

package main

import (
	"errors"
	"fmt"
)

// 自定义Error
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 {
		// set
	}
	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)
}


网站公告

今日签到

点亮在社区的每一天
去签到