標籤:作業系統 request UNC perm range ons 語句 聲明 方式
· error類型是一個介面類型,也是一個Go語言的內建類型。在這個介面類型的聲明中只包含了一個方法Error。這個方法不接受任何參數,但是會返回一個string類型的結果。它的作用是返回錯誤資訊的字串表示形象。我們使用error類型的方式通常是,在函式宣告結果清單的最後,聲明一個該類型的結果。同時在調用這個函數之後,先判斷它返回的最後一個結果是否"不為nil"。如果不為nil那麼就進入錯誤處理流程,否則就繼續進行正常的流程。
package mainimport ( "errors" "fmt")func echo(request string) (response string, err error) { if request == "" { //如果request為空白,調用error.New函數為結果賦值,然後忽略後邊操作返回。response返回Null 字元串 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) }}
【Go】錯誤處理