*os.PathError

记录错误以及导致错误的操作和文件路径。

type PathError struct {
    Op   string
    Path string
    Err  error
}
func main() {
	file, err := os.Open("./go1.mod")
	// 判断是否操作成功
	if err != nil {
		if pathError := err.(*os.PathError); !ok {
			panic(err)
		} else {
			fmt.Printf("路径: %v, 错误: %v ", pathError.Path, pathError.Err)
		}
		return
	}
	// 延迟调用 操作成功在defer
	defer file.Close()
}

错误

errors.New("this is err2")

应用

func Div(a, b int) (r int, e error) {
	e= nil
	if b == 0 {
		e = errors.New("分母不能为0")
	} else {
		r = a / b
	}
	return
}

func main() {
	r, err := Div(5, 2)
	if err != nil {
		fmt.Println("err = ", err)
	} else {
		fmt.Println("r = ", r)
	}
	// 输出2 如果出错输出错误
}

显示调用panic

func testa() {
	fmt.Println("a")
}
func testb() {
	// 显示调用,panic函数导致程序中断
	panic("this is a panic")
}
func testc() {
	fmt.Println("c")
}

func main() {
	testa()	// 输出a
	testb()	// 输出 this is a panic
	testc()
}

recover

仅在defer中调用 宕机恢复

func testa() {
	fmt.Println("a")
}
func testb(x int) {
	// 设置recover
	defer func() {
		if err := recover(); err != nil {
			fmt.Println(err)
		}
	}()
	var a [10]int
	a[x] = 111 // 当x为20的时候,导致数组越界,产生panic,程序崩溃
}
func testc() {
	fmt.Println("c")
}

func main() {
	testa()
	testb(20)
	testc()
}