واجهة error
إرجاع الأخطاء والتحقق منها وفق أساليب Go
واجهة error درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
فلسفة Go في التعامل مع الأخطاء
يتعامل Go مع الأخطاء باعتبارها قيمًا، لا استثناءات. تُرجع الدوال قيمة من النوع error باعتبارها آخر قيمة إرجاع. ويجب على المتصل التحقق منها صراحةً:
package main
import ("fmt"; "strconv")
func main() {
n, err := strconv.Atoi("abc")
if err != nil {
fmt.Println("error:", err) // handle it
return
}
fmt.Println(n)
}واجهة error
النوع المضمّن error هو واجهة بسيطة:
// Built into Go — no import needed
type error interface {
Error() string
}
// Any type with Error() string satisfies it
// nil means no errorإرجاع الأخطاء
تُرجع الدوال التي قد تفشل (value, error). أرجع nil عند عدم وجود خطأ:
package main
import ("fmt"; "errors")
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("division by zero")
}
return a / b, nil
}
func main() {
result, err := divide(10, 0)
if err != nil {
fmt.Println("error:", err)
return
}
fmt.Println(result)
}نمط if err != nil
يُعد فحص if err != nil أكثر اصطلاحات Go شيوعًا. تعامل دائمًا مع الأخطاء — ولا تتجاهلها:
package main
import ("fmt"; "os")
func main() {
f, err := os.Open("config.json")
if err != nil {
fmt.Println("open error:", err)
return
}
defer f.Close()
// use f...
_ = f
}errors.New — قيم أخطاء بسيطة
تنشئ errors.New خطأً بسيطًا برسالة ثابتة:
package main
import ("fmt"; "errors")
var ErrNotFound = errors.New("not found")
func findByID(id int) (string, error) {
data := map[int]string{1: "Alice"}
v, ok := data[id]
if !ok {
return "", ErrNotFound
}
return v, nil
}
func main() {
_, err := findByID(99)
fmt.Println(err) // not found
}fmt.Errorf — رسائل أخطاء منسّقة
تنشئ fmt.Errorf أخطاءً تحتوي على سياق من سلاسل نصية منسّقة:
package main
import "fmt"
func openConfig(path string) error {
// Add context to the error message
return fmt.Errorf("openConfig %s: file not found", path)
}
func main() {
err := openConfig("/etc/app/config.yaml")
fmt.Println(err)
// openConfig /etc/app/config.yaml: file not found
}أخطاء Sentinel
أخطاء Sentinel هي قيم أخطاء على مستوى الحزمة، وتُستخدم للمقارنة بالهوية:
package main
import ("fmt"; "errors")
var (
ErrTimeout = errors.New("timeout")
ErrPermission = errors.New("permission denied")
)
func doRequest() error { return ErrTimeout }
func main() {
err := doRequest()
if errors.Is(err, ErrTimeout) {
fmt.Println("request timed out — retrying")
}
}تجاهل الأخطاء خطأ برمجي
يتطلب Go استخدام كل متغير مُعلَن — لكن تجاهل الأخطاء باستخدام _ يُترجم بنجاح، وهو خطأ شائع ينبغي تجنبه:
package main
import "os"
func bad() {
os.Remove("temp.txt") // silently ignores error — bad practice
}
func good() error {
if err := os.Remove("temp.txt"); err != nil {
return err // propagate
}
return nil
}سياق الخطأ: إضافة معلومات
عند تمرير الأخطاء إلى أعلى مكدس الاستدعاءات، أضف سياقًا يصف العملية التي فشلت:
package main
import "fmt"
func readConfig(path string) ([]byte, error) {
return nil, fmt.Errorf("readConfig: %w", fmt.Errorf("file %s not found", path))
}
func setup() error {
_, err := readConfig("/etc/app.cfg")
if err != nil {
return fmt.Errorf("setup: %w", err) // wrap with context
}
return nil
}
func main() {
err := setup()
fmt.Println(err) // setup: readConfig: file /etc/app.cfg not found
}إرجاع أخطاء متعددة
قد تُرجع الدوال أخطاءً من نقاط فشل متعددة. تحقّق من كل منها:
package main
import ("fmt"; "strconv")
func parseRange(minStr, maxStr string) (int, int, error) {
min, err := strconv.Atoi(minStr)
if err != nil { return 0, 0, fmt.Errorf("min: %w", err) }
max, err := strconv.Atoi(maxStr)
if err != nil { return 0, 0, fmt.Errorf("max: %w", err) }
if min > max { return 0, 0, fmt.Errorf("min %d > max %d", min, max) }
return min, max, nil
}
func main() {
lo, hi, err := parseRange("1", "10")
if err != nil { fmt.Println(err); return }
fmt.Println(lo, hi)
}تحقق سريع
إلى ماذا تشير قيمة الخطأ nil المُرجعة في Go؟
مراجعة: واجهة error
مفاهيم أساسية في التعامل مع الأخطاء:
- الخطأ واجهة مضمّنة:
Error() string - أرجع
(value, error)— تعني nil نجاح العملية - استخدم
errors.Newللأخطاء البسيطة، وfmt.Errorfللأخطاء المنسّقة - تحقّق دائمًا من
if err != nil - أضف سياقًا عند تمرير الأخطاء إلى أعلى المكدس
- لا تتجاهل الأخطاء بصمت مطلقًا
الأسئلة الشائعة
هل درس «واجهة error» مجاني؟
نعم — نص درس «واجهة error» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «واجهة error»؟
إرجاع الأخطاء والتحقق منها وفق أساليب Go تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «واجهة error»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.