• English
  • 返回並處理錯誤

    注意: 本文是系列教學的一部分,該系列始於 建立 Go 模組

    處理錯誤是可靠程式碼的重要組成部分。在本節中,你將加入一些程式碼以從 greetings 模組返回錯誤,然後在呼叫者中處理它。

    步驟

    1. 修改 greetings/greetings.go 以返回錯誤

    greetings/greetings.go 中,加入下面高亮顯示的程式碼。

    如果你不知道要問候誰,那麼返回問候語就沒有意義。如果名字為空,則向呼叫者返回錯誤。將以下程式碼複製到 greetings.go 並儲存檔案。

    package greetings
    
    import (
        "errors"
        "fmt"
    )
    
    // Hello 返回指定人的問候語。
    func Hello(name string) (string, error) {
        // 如果沒有提供名字,則返回帶有訊息的錯誤。
        if name == "" {
            return "", errors.New("empty name")
        }
    
        // 如果收到名字,則返回嵌入名字在問候語中的值。
        message := fmt.Sprintf("Hi, %v. Welcome!", name)
        return message, nil
    }

    在這段程式碼中,你:

    • 更改函數,使其返回兩個值:一個 string 和一個 error。呼叫者將檢查第二個值,看看是否發生了錯誤。(任何 Go 函數都可以返回多個值。更多資訊,請參閱 Effective Go。)
    • 匯入 Go 標準函式庫的 errors 套件,以便你可以使用其 errors.New 函數
    • 加入一個 if 語句來檢查無效請求(名字應為空字串),如果請求無效,則返回錯誤。errors.New 函數返回一個包含你訊息的 error
    • 在成功返回時加入 nil(表示無錯誤)作為第二個值。這樣,呼叫者可以看到函數成功。

    2. 在 hello/hello.go 中處理錯誤

    在你的 hello/hello.go 檔案中,處理現在由 Hello 函數返回的錯誤以及非錯誤值。

    將以下程式碼貼上到 hello.go

    package main
    
    import (
        "fmt"
        "log"
    
        "example.com/greetings"
    )
    
    func main() {
        // 設定預定義 Logger 的屬性,包括日誌條目前綴和一個停用列印時間、來源檔案和行號的標誌。
        log.SetPrefix("greetings: ")
        log.SetFlags(0)
    
        // 請求問候語。
        message, err := greetings.Hello("")
        // 如果返回了錯誤,則將其列印到主控台並退出程式。
        if err != nil {
            log.Fatal(err)
        }
    
        // 如果沒有返回錯誤,則將返回的訊息列印到主控台。
        fmt.Println(message)
    }

    在這段程式碼中,你:

    • 設定 log 套件 在其日誌訊息的開頭列印命令名稱("greetings: "),不帶時間戳或來源檔案資訊。
    • 分配 Hello 的所有返回值,包括 error,到變數。
    • Hello 的參數從 Gladys 的名字更改為空字串,以便你可以嘗試錯誤處理程式碼。
    • 尋找非 nil 的 error 值。在這種情況下,繼續執行沒有意義。
    • 使用標準函式庫的 log 套件中的函數來輸出錯誤資訊。如果你收到錯誤,則使用 log 套件的 Fatal 函數 列印錯誤並停止程式。

    3. 執行 hello.go 以確認程式碼正常工作

    hello 目錄的命令列中,執行 hello.go 以確認程式碼正常工作。

    現在你傳遞了一個空名字,你將得到一個錯誤。

    $ go run .
    greetings: empty name
    exit status 1

    結論

    這就是 Go 中常見的錯誤處理:將錯誤作為值返回,以便呼叫者可以檢查它。

    接下來,你將使用 Go 切片返回隨機選擇的問候語。