4.8 טיפול בשגיאות הרצאה
המשתנה errnoהוא משתנה גלובלי מיוחד שמייצג את קוד השגיאה האחרון שהתרחש בפעולה מערכתית כלשהי. למשל, אם קריאה כמו fopen, malloc, או read נכשלת – היא לא רק מחזירה ערך שמסמן שגיאה (כמו NULL או -1), אלא גם מעדכנת את errno בקוד שגיאה מספרי שמתאר מה השתבש.
כדי להשתמש בו, יש לכלול את הקובץ:
דוגמה:
הקוד שנשמר ב־errno משתנה בין מערכות, אבל יש לו ערכים סטנדרטיים כמו:
-
2– קובץ לא נמצא (ENOENT) -
12– אין מספיק זיכרון (ENOMEM) -
13– אין הרשאה (EACCES)
שימוש ב־errno חייב להיעשות רק אם ידוע שהייתה שגיאה, כי הוא לא מתאפס לבד – ולכן מומלץ לא לקרוא אותו אחרי קריאות שהצליחו.
הפונקציה perror מדפיסה למסך את השגיאה האחרונה שקרתה לפי ערך errno. היא מקבלת מחרוזת ככותרת לפלט, ואז מוסיפה את הפירוש של הקוד.
הפלט עשוי להיראות כך:
פונקציה זו מאוד נוחה לדיבוג, במיוחד בפונקציות שיכולות להיכשל מסיבות מערכתיות (כמו גישה לקובץ, פתיחת סוקט, הקצאת זיכרון).
הפונקציה 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אם לא הייתה שגיאה – פשוט אל תשתמש בו אם הפעולה הצליחה