6

קבצים וחריגות

Files & Exceptions

🎯 מטרות הלמידה

  • קריאה וכתיבה לקבצים
  • הבנת מצבי עבודה (modes): r, w, a
  • שימוש ב-with לניהול משאבים
  • טיפול בשגיאות עם try-except-finally
  • זריקת שגיאות יזומות עם raise

6.1מבוא לעבודה עם קבצים

🗄️ למה צריך קבצים?

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

שלבי העבודה עם קובץ:

  1. 📂 פתיחה - open(filename, mode)
  2. ✏️ קריאה/כתיבה - .read(), .write()
  3. 🔒 סגירה - .close()
🔗 קישור למודולים קודמים: כשנקרא קובץ, הנתונים יישמרו ברשימה (מודול 3) או מחרוזת (מודול 4). נשתמש בלולאות (מודול 2) לעבור על השורות.

6.2מצבי עבודה (Modes)

🔑 מצבי פתיחה

מצבתיאוראם הקובץ לא קיים
'r'קריאה בלבד (Read)⚠️ שגיאה!
'w'כתיבה (Write) - מוחק תוכן קיים!✅ נוצר חדש
'a'הוספה (Append) - מוסיף לסוף✅ נוצר חדש

דוגמה - שילוב עם רשימה (מודול 3):

# קריאת שמות מקובץ לתוך רשימה
names = []  # רשימה ריקה (מודול 3)
file = open('students.txt', 'r')
for line in file:  # לולאת for (מודול 2)
    names.append(line.strip())  # strip מסיר רווחים (מודול 4)
file.close()
print(names)

6.3ניהול משאבים עם with

🛡️ הדרך הבטוחה - with statement

מה קורה אם שכחנו לסגור את הקובץ? או אם קרתה שגיאה באמצע? פקודת with פותרת את הבעיה:

# הדרך הנכונה והבטוחה:
with open('data.txt', 'r') as file:
    content = file.read()  # מחרוזת אחת גדולה
    lines = content.split('\n')  # פיצול למחרוזות (מודול 4)
# כאן הקובץ כבר סגור אוטומטית!
🏨 אנלוגיה: תחשוב על with כמו חדר מלון - כשאתה יוצא מהחדר (יוצא מהבלוק), הכל מתנקה אוטומטית.

6.4טיפול בחריגות - try/except

⚠️ כשדברים משתבשים

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

מבנה try-except-else-finally:

try:
    # קוד שעלול לגרום לשגיאה
    result = risky_operation()
except SpecificError as e:
    # טיפול בשגיאה ספציפית
    print(f'שגיאה: {e}')
else:
    # רץ רק אם הצליח (אין שגיאה)
    print('הצלחה!')
finally:
    # רץ תמיד - ניקוי משאבים
    cleanup()

דוגמה מלאה - שילוב כל המודולים:

def load_grades(filename):
    """טוען ציונים מקובץ לתוך מילון (מודול 5)"""
    grades = {}  # מילון ריק
    try:
        with open(filename, 'r') as file:
            for line in file:  # לולאה (מודול 2)
                parts = line.strip().split(',')  # מחרוזות (מודול 4)
                name, score = parts[0], int(parts[1])
                grades[name] = score  # מילון (מודול 5)
    except FileNotFoundError:
        print('קובץ לא נמצא!')
        return None
    except ValueError:
        print('פורמט לא תקין!')
        return None
    return grades

6.5try/except/else/finally - סדר הביצוע המלא

🛡️ מנגנון טיפול בחריגות מלא

def divide(a, b):
    try:
        result = a / b          # 1. מנסה
    except ZeroDivisionError:
        print('חלוקה באפס!')    # 2. תפסנו שגיאה
        return None
    except TypeError as e:
        print(f'שגיאת טיפוס: {e}')  # 3. שגיאה שונה
        return None
    else:
        print('הצלחה!')         # 4. רץ רק אם לא הייתה שגיאה
        return result
    finally:
        print('תמיד מתבצע!')    # 5. תמיד!

print(divide(10, 2))
# הצלחה!
# תמיד מתבצע!
# 5.0

print(divide(10, 0))
# חלוקה באפס!
# תמיד מתבצע!
# None
⚠️ מלכודת מבחן: except מסדר כללי לספציפי! אם תשים except Exception ראשון, הוא יתפוס הכל והבלוקים הספציפיים לעולם לא ירוצו!
💡 finally רץ גם אם יש return! פייתון מבצעת את finally לפני שמחזירה את הערך.

6.6סוגי חריגות נפוצות

⚠️ חריגות שחובה להכיר

חריגהגורםדוגמה
ValueErrorערך לא מתאיםint('abc')
TypeErrorטיפוס לא מתאים'גיל: ' + 25
IndexErrorאינדקס מחוץ לטווח[1,2,3][5]
KeyErrorמפתח לא קייםd['missing']
ZeroDivisionErrorחלוקה באפס10 / 0
FileNotFoundErrorקובץ לא קייםopen('no.txt', 'r')
AttributeErrorמאפיין לא קייםNone.upper()
NameErrorשם לא מוגדרprint(x) בלי x
try:
    x = int(input('הכנס מספר: '))
    result = 10 / x
except ValueError:
    print('זה לא מספר!')
except ZeroDivisionError:
    print('אסור לחלק באפס!')
else:
    print(f'התוצאה: {result}')
finally:
    print('סיום')

שאלות תרגול

5 שאלות בנושא זה

התחל תרגול →