*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()
}