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.AsType نسخهٔ پیشرفته‌تر errors.Is است. بررسی می‌کند که آیا یک خطای مشخص (یا هر خطایی در زنجیره‌اش) با یک نوع خطای مشخص مطابقت دارد، و در این صورت آن را به مقداری از همان نوع تبدیل می‌کند و true هم برمی‌گرداند. اگر مطابقتی نباشد، مقدار بازگشتی دوم false است.

    _, err := f(42)
    if ae, ok := errors.AsType[*argError](err); ok {
        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

مثال بعدی: .