1. 程式人生 > >【Go】錯誤處理

【Go】錯誤處理

·  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)
    }
}