实用指南:Go语言入门(21)-错误处理
Go语言允许函数和方法同时返回多个值。按照惯例,函数在返回错误时,最后边的返回值应用来表示错误。调用函数后,应立即检查是否发生错误。
如果没有错误发生,那么返回的错误值为nil。
package main
import (
"fmt"
"os"
)
func main() {
//"." 是一个标准的表示法,代表当前目录,即程序运行时所在的目录.
//当你传递 "." 给 ioutil.ReadDir() 时,函数会读取当前工作目录中的所有文件和子目录。
files, err := ioutil.ReadDir("../")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
for _, file := range files {
fmt.Println(file.Name())
}
}
那如何优雅地进行错误处理/减少错误处理代码呢?有一种策略是:将程序中不会出错地部分和包含潜在错误隐患地部分隔离开来。对于不得不返回错误地代码,应尽力简化相应地错误处理代码。
再写入文件时,可能会出错,例如:路径不正确、权限不够、磁盘空间不够等。。。
文件写入完毕后,必须被关闭,确保文件被刷到磁盘上,避免资源的泄露。下面看一个例子
package main
import (
"fmt"
"os"
)
// 文件写入
func proverbs(name string) error {
f, err := os.Create(name)
if err != nil {
return err
}
defer f.Close() //defer关键字,可确保所有被defer的动作可以在函数返回前执行。
_, err = fmt.Fprintln(f, "Errors are values.")
if err != nil {
//有defer,就可以注释掉下方的语句
//f.Close() //文件写入完毕后,必须被关闭,确保文件被刷到磁盘上,避免资源泄露。
return err
}
_, err = fmt.Fprintln(f, "Don't just check errors,handle them gracefully.")
f.Close() //有defer,就可以注释该语句
return err
}
//文件写入
func main() {
// 文件写入
err := proverbs("proverbs23.txt")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
//文件写入
}
defer关键字:
上述例程中用到了defer(),它是Go语言中关键字的一种,可以确保所有deferred的动作可以在函数返回前执行。

浙公网安备 33010602011771号