4.8 טיפול בשגיאות הרצאה

המשתנה errnoהוא משתנה גלובלי מיוחד שמייצג את קוד השגיאה האחרון שהתרחש בפעולה מערכתית כלשהי. למשל, אם קריאה כמו fopen, malloc, או read נכשלת – היא לא רק מחזירה ערך שמסמן שגיאה (כמו NULL או -1), אלא גם מעדכנת את errno בקוד שגיאה מספרי שמתאר מה השתבש.

כדי להשתמש בו, יש לכלול את הקובץ:

#include <errno.h>

דוגמה:

FILE *f = fopen("קובץ_לא_קיים.txt", "r");
if (f == NULL) {
    printf("קוד שגיאה: %d\n", errno);
}

הקוד שנשמר ב־errno משתנה בין מערכות, אבל יש לו ערכים סטנדרטיים כמו:

  • 2 – קובץ לא נמצא (ENOENT)

  • 12 – אין מספיק זיכרון (ENOMEM)

  • 13 – אין הרשאה (EACCES)

שימוש ב־errno חייב להיעשות רק אם ידוע שהייתה שגיאה, כי הוא לא מתאפס לבד – ולכן מומלץ לא לקרוא אותו אחרי קריאות שהצליחו.


הפונקציה perror מדפיסה למסך את השגיאה האחרונה שקרתה לפי ערך errno. היא מקבלת מחרוזת ככותרת לפלט, ואז מוסיפה את הפירוש של הקוד.

FILE *f = fopen("nofile.txt", "r");
if (f == NULL) {
    perror("שגיאה בפתיחת הקובץ");
}

הפלט עשוי להיראות כך:

שגיאה בפתיחת הקובץ: No such file or directory

פונקציה זו מאוד נוחה לדיבוג, במיוחד בפונקציות שיכולות להיכשל מסיבות מערכתיות (כמו גישה לקובץ, פתיחת סוקט, הקצאת זיכרון).


הפונקציה strerror מחזירה מחרוזת שמתארת טקסטואלית את קוד השגיאה המספרי. זה שימושי אם רוצים להציג את השגיאה בדרך מותאמת אישית, ולא ישר להדפיס למסך כמו ש־perror עושה.

#include <string.h>

FILE *f = fopen("nofile.txt", "r");
if (f == NULL) {
    printf("שגיאה: %s\n", strerror(errno));
}

שימושי גם בלולאות או כשמדפיסים לjournal לוגים.


לסיכום:

  • errno הוא קוד שגיאה גלובלי שמתעדכן כאשר פעולה נכשלה
  • perror מדפיסה את השגיאה האחרונה עם הסבר
  • strerror ממירה את הקוד של errno למחרוזת טקסט
  • תמיד בדוק את ערך ההחזרה של הפונקציה לפני קריאה ל־errno
  • אל תניח ש־errno == 0 אם לא הייתה שגיאה – פשוט אל תשתמש בו אם הפעולה הצליחה