Go بالأمثلة: الأخطاء المخصصة (Custom Errors)

من الممكن تعريف أنواع أخطاء مخصصة عن طريق تطبيق دالة 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, "لا يمكن العمل معه"}
    }
    return arg + 3, nil
}

func main() {

errors.As هي نسخة أكثر تقدماً من errors.Is. تتحقق مما إذا كان خطأ معين يطابق نوع خطأ محدد وتقوم بتحويله إلى قيمة من ذلك النوع، مع إرجاع true.

    _, err := f(42)
    var ae *argError
    if errors.As(err, &ae) {
        fmt.Println(ae.arg)
        fmt.Println(ae.message)
    } else {
        fmt.Println("err لا يطابق argError")
    }
}

تشغيل البرنامج:

$ go run custom-errors.go
42
لا يمكن العمل معه

المثال التالي: الـ Goroutines.