實用指南: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號