golang 错误处理
程序员文章站
2022-06-24 17:01:55
...
一、defer
package main
import (
"fmt"
"os"
"bufio"
)
func tryDefer() {
for i := 0; i < 100; i++ {
defer fmt.Println(i)
if i == 30 {
// Uncomment panic to see
// how it works with defer
panic("printed too many")
}
}
}
func writeFile(filename string) {
file, err := os.OpenFile(filename,
os.O_EXCL|os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
if pathError, ok := err.(*os.PathError); !ok {//错误处理,向下转型
panic(err)
} else {
fmt.Printf("%s, %s, %s\n",
pathError.Op,
pathError.Path,
pathError.Err)
}
return
}
defer file.Close()//无论return、panic最后都会被执行
writer := bufio.NewWriter(file)
defer writer.Flush()//先进后执行,后进先执行,退出时先执行Flush,再执行Close
f := Fibonacci()
for i := 0; i < 20; i++ {
fmt.Fprintln(writer, f())
}
}
func main() {
tryDefer()
writeFile("fib.txt")
}
输出:
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
panic: printed too many
goroutine 1 [running]:
main.tryDefer()
/Users/jltxgcy/go/src/learn/errhandling/defer/defer.go:24 +0x111
main.main()
/Users/jltxgcy/go/src/learn/errhandling/defer/defer.go:56 +0x20
defer执行的顺序是先进后执行,无论是return还是panic,defer都会执行,用于关闭资源等,通常是成对出现。
上一篇: UILabel,UIButton,UITextField的简单使用
下一篇: 路径规划算法