【Go】錯誤處理
阿新 • • 發佈:2018-11-10
· error型別是一個介面型別,也是一個Go語言的內建型別。在這個介面型別的宣告中只包含了一個方法Error。這個方法不接受任何引數,但是會返回一個string型別的結果。它的作用是返回錯誤資訊的字串表示形象。我們使用error型別的方式通常是,在函式宣告結果列表的最後,宣告一個該型別的結果。同時在呼叫這個函式之後,先判斷它返回的最後一個結果是否"不為nil"。如果不為nil那麼就進入錯誤處理流程,否則就繼續進行正常的流程。
package main import ( "errors" "fmt" ) func echo(request string) (response string, err error) { if request == "" { //如果request為空,呼叫error.New函式為結果賦值,然後忽略後邊操作返回。response返回空字串 err = errors.New("empty content") return } response = fmt.Sprintf("echo: %s", request) return //err值為nil } func main() { for _, req := range []string{"", "hello!"} { fmt.Printf("request: %s\n", req) resp, err := echo(req) if err != nil { fmt.Printf("error: %s\n", err) continue } fmt.Printf("response: %s\n", resp) } }
由於error是一個介面型別,所以即使同為error型別的錯誤值,它們的實際型別也可能不同。怎樣判斷一個錯誤值具體代表的是哪一類錯誤呢?
1)對於型別在已知範圍內的一系列錯誤值,一般使用型別斷言表示式或型別switch語句來判斷
2)對於已有相應變數且型別相同的一系列錯誤值,一般直接使用判等操作來判斷
3)對於沒有響應變數且型別未知的一系列錯誤值,只能使用其錯誤資訊的字串表示形式來做判斷
func underlyingError(err error) error { //獲取和返回已知作業系統相關錯誤的潛在錯誤值 switch err := err.(type) { case *os.PathError: return err.Err //返回函式引數err的Err欄位 case *os.LinkError: return err.Err case *os.SyscallError: return err.Err case *exec.Error: return err.Err } return err //直接把函式引數值返回 } printError := func(i int, err error) { if err == nil { fmt.Println("nil error") return } err = underlyingError(err) switch err { case os.ErrClosed: fmt.Printf("error(closed)[%d]: %s\n", i, err) case os.ErrInvalid: fmt.Printf("error(invalid)[%d]: %s\n", i, err) case os.ErrPermission: fmt.Printf("error(permission)[%d]: %s\n", i, err) } }