مكتبة errors في Go: دليل شامل مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مكتبة errors في Go: دليل شامل لمعالجة الأخطاء المتقدمة

1. ما هي ولماذا تحتاجها

مكتبة errors هي حزمة قياسية في لغة Go توفر دوال أساسية لإنشاء الأخطاء وتنسيقها ومعالجتها. على عكس العديد من اللغات الأخرى التي تستخدم الاستثناءات (exceptions) كآلية رئيسية لمعالجة الأخطاء، تعتمد Go على إرجاع قيم الأخطاء بشكل صريح من الدوال. وهذا يجعل تدفق تنفيذ البرنامج أكثر قابلية للتنبؤ والتحكم.

المهمة الأساسية للمكتبة هي توفير طريقة بسيطة وفعالة لإنشاء أخطاء جديدة، ومقارنة أنواعها، وإضافة معلومات سياقية (مثل "تغليف" الأخطاء). في Go، الخطأ هو مجرد واجهة error، والتي يمكن لأي نوع تنفيذها عبر توفير دالة Error() string. وهذا يمنحك مرونة هائلة: يمكنك إنشاء أنواع أخطاء مخصصة تحتوي على حقول إضافية (رمز الخطأ، بيانات الطلب، إلخ).

لماذا تحتاجها؟ بدونها، لا يمكنك كتابة تطبيق Go موثوق. في كل مرة قد تفشل فيها دالة (التعامل مع الملفات، الشبكة، قاعدة البيانات)، فإنها تُرجع خطأ. تجاهل الأخطاء (تعيينها لمتغير _) يعتبر ممارسة سيئة. تتيح لك مكتبة errors ليس فقط الإبلاغ عن الخطأ، بل أيضاً بناء سلسلة من الأخطاء لمعرفة المرحلة التي حدث فيها العطل بدقة أثناء التصحيح.

2. التثبيت

حزمة errors هي جزء من المكتبة القياسية للغة Go. هذا يعني أنه لا يلزم أي تثبيت إضافي. إنها متاحة "مباشرة" عند تثبيت أي Go SDK. لاستخدامها، يكفي استيرادها في الكود الخاص بك:

import "errors"

إذا كنت تستخدم Go Modules (وهو المعيار منذ Go 1.11+)، فستكون الحزمة متاحة تلقائياً. لا حاجة لتنفيذ أي أوامر go get للمكتبة القياسية.

ملاحظة مهمة: توجد أيضاً مكتبة خارجية شهيرة github.com/pkg/errors توفر وظائف متقدمة (تتبع الاستدعاءات، التنسيق). لكن في هذه المقالة، نركز حصراً على الحزمة القياسية errors، والتي تعتبر الأساس لأي معالجة أخطاء في Go.

3. البداية السريعة

مثال عملي بسيط لإنشاء خطأ ومعالجته:

package main

import (
    "errors"
    "fmt"
)

// دالة تقسم رقمين. إذا كان المقسوم عليه صفراً، تُرجع خطأ.
func divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, errors.New("القسمة على صفر غير ممكنة")
    }
    return a / b, nil
}

func main() {
    result, err := divide(10, 2)
    if err != nil {
        fmt.Println("خطأ:", err)
    } else {
        fmt.Println("النتيجة:", result)
    }

    // لنحاول مع خطأ
    result2, err2 := divide(10, 0)
    if err2 != nil {
        fmt.Println("خطأ:", err2) // المخرجات: خطأ: القسمة على صفر غير ممكنة
    } else {
        fmt.Println("النتيجة:", result2)
    }
}

في هذا المثال، أنشأنا خطأ بسيطاً باستخدام errors.New() وتحققنا من وجوده بالطريقة القياسية if err != nil.

4. الدوال والطرق الأساسية

فيما يلي 8 دوال/طرق رئيسية في حزمة errors مع شرح مفصل وأمثلة.

4.1 errors.New(text string) error

التوقيع: func New(text string) error

الوظيفة: تنشئ خطأ جديداً بالنص المحدد.

توصيات