الدرس 55: معالجة الأخطاء: errno و perror
في لغة C، تشير العديد من دوال المكتبة القياسية (خاصة I/O واستدعاءات النظام) إلى الفشل عن طريق إرجاع قيمة خاصة (مثل NULL لـ fopen أو -1 لاستدعاءات النظام). في نفس الوقت، تقوم بتعيين متغير صحيح عالمي يسمى errno للإشارة إلى سبب وقوع الفشل.
متغير errno
- معرف في
<errno.h>. - يتم تعيينه بواسطة استدعاءات النظام ودوال المكتبة عند الفشل.
- قيمته عبارة عن رقم مشفر يمثل نوع الخطأ المحدد (مثلاً: 'الملف غير موجود'، 'تم رفض الإذن').
ملاحظة هامة: يكون errno ذا معنى فقط فور فشل الدالة. لا يضمن الحفاظ على قيمته عبر الاستدعاءات الناجحة غير ذات الصلة.
دالة perror()
تقوم perror() بطباعة رسالة خطأ وصفية إلى stderr (الخطأ القياسي) بناءً على القيمة الحالية لـ errno. تتيح لك إضافة بادئة نصية مخصصة لرسالة الخطأ.
القاعدة: void perror(const char *s);
مثال: خطأ في فتح ملف
c #include <stdio.h> #include <errno.h>
int main() { FILE *fp;
// محاولة فتح ملف غير موجود للقراءة
fp = fopen("nonexistent.dat", "r");
if (fp == NULL) {
// استخدام perror لطباعة رسالة خطأ وصفية
perror("فشلت عملية الملف");
// قد يبدو المخرج كالتالي:
// فشلت عملية الملف: No such file or directory
return 1;
}
fclose(fp);
return 0;
}
strerror()
تعيد دالة strerror() (في <string.h>) مؤشراً لسلسلة نصية مفهومة للبشر تقابل رقماً معيناً للخطأ، وهو أمر مفيد إذا كنت ترغب في تسجيل رسالة الخطأ في سجل (log) بدلاً من طباعتها فوراً.