開心檔之Go 錯誤處理

雪奈椰子發表於2023-03-31

# [Go 錯誤處理](%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86)


Go 語言透過內建的錯誤介面提供了非常簡單的錯誤處理機制。


error型別是一個介面型別,這是它的定義:


```


type error interface {

    Error() string

}

```


我們可以在編碼中透過實現 error 介面型別來生成錯誤資訊。


函式通常在最後的返回值中返回錯誤資訊。使用errors.New 可返回一個錯誤資訊:


```


func Sqrt(f float64) (float64, error) {

    if f < 0 {

        return 0, errors.New("math: square root of negative number")

    }

    // 實現

}

```


在下面的例子中,我們在呼叫Sqrt的時候傳遞的一個負數,然後就得到了non-nil的error物件,將此物件與nil比較,結果為true,所以fmt.Println(fmt包在處理error時會呼叫Error方法)被呼叫,以輸出錯誤,請看下面呼叫的示例程式碼:


```


result, err:= Sqrt(-1)


if err != nil {

   fmt.Println(err)

}

```


### [例項](%E5%AE%9E%E4%BE%8B)


## [例項](%E5%AE%9E%E4%BE%8B-1)


package main


import (  

"fmt"  

)


// 定義一個 DivideError 結構  

type DivideError struct {  

dividee int  

divider int  

}


// 實現 `error` 介面  

func (de *DivideError) Error() string {  

strFormat := `  

Cannot proceed, the divider is zero.  

dividee: %d  

divider: 0  

`  

return fmt.Sprintf(strFormat, de.dividee)  

}


// 定義 `int` 型別除法運算的函式  

func Divide(varDividee int, varDivider int) (result int, errorMsg string) {  

if varDivider == 0 {  

dData := DivideError{  

dividee: varDividee,  

divider: varDivider,  

}  

errorMsg = dData.Error()  

return  

} else {  

return varDividee / varDivider, ""  

}


}


func main() {


// 正常情況  

if result, errorMsg := Divide(100, 10); errorMsg == "" {  

fmt.Println("100/10 = ", result)  

}  

// 當除數為零的時候會返回錯誤資訊  

if _, errorMsg := Divide(100, 0); errorMsg != "" {  

fmt.Println("errorMsg is: ", errorMsg)  

}


}


執行以上程式,輸出結果為:


```


100/10 =  10

errorMsg is:  

    Cannot proceed, the divider is zero.

    dividee: 100

    divider: 0

```


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70026554/viewspace-2943193/,如需轉載,請註明出處,否則將追究法律責任。

相關文章