Go 示範:自訂錯誤

可以透過實作自訂型別中的 `Error()` 方法,將其用作錯誤。以下是上述範例的變體,其使用自訂型別明確表示引數錯誤。

package main
import (
    "errors"
    "fmt"
)

自訂錯誤型別通常含有「Error」後綴。

type argError struct {
    arg     int
    message string
}

新增這個 `Error` 方法可讓 `argError` 實作 `error` 介面。

func (e *argError) Error() string {
    return fmt.Sprintf("%d - %s", e.arg, e.message)
}
func f(arg int) (int, error) {
    if arg == 42 {

傳回我們自訂的錯誤。

        return -1, &argError{arg, "can't work with it"}
    }
    return arg + 3, nil
}
func main() {

errors.As 是 `errors.Is` 的進階版本。它會檢查指定的錯誤(或其串鏈中的任何錯誤)是否符合特定錯誤型別,若符合則會轉換為該型別的值,並傳回 `true`。若不符合,則會傳回 `false`。

    _, err := f(42)
    var ae *argError
    if errors.As(err, &ae) {
        fmt.Println(ae.arg)
        fmt.Println(ae.message)
    } else {
        fmt.Println("err doesn't match argError")
    }
}
$ go run custom-errors.go
42
can't work with it

下一個範例:Goroutine