# מערך שיעור: Exceptions לעומק📋 מערך מרצה

משך: 2 שעות אקדמיות (90 דקות).

מטרת השיעור: הסטודנטים יבינו את היררכיית ה-Exceptions וייצרו Custom Exception עסקי משל עצמם.

בסוף השיעור הסטודנטים צריכים: לסדר נכון כמה בלוקי catch לפי היררכיה, ליצור Custom Exception עם שדות מותאמים אישית, ולהסביר למה חריגה עסקית עדיפה על Exception גנרי.

דגש קריטי: זהו הרחבה ישירה של שיעור ה-Exceptions הבסיסי מהיחידה הקודמת — פתחו בחזרה קצרה על try/catch/finally לפני שמעמיקים.

---

## מהלך השיעור

| חלק בשיעור | משך | הערות ודגשים |
| --- | --- | --- |
| פתיחה וחיבור | 5 דקות | חזרה קצרה: try/catch/finally מהיחידה הקודמת |
| הרעיון: היררכיה | 15 דקות | כל Exception יורש מ-Exception; catch כללי תופס גם ספציפי |
| הבעיה: סדר catch שגוי | 10 דקות | הדגימו שגיאת קומפילציה כשclass הכללי לפני הספציפי |
| הבעיה: Exception גנרי לשגיאה עסקית | 10 דקות | throw new Exception("no money") — קשה לתפוס ממוקד |
| הרעיון: Custom Exception | 25 דקות | InsufficientFundsException עם שדות ובנייה עם base |
| תרגול מודרך | 20 דקות | תרגיל 1+2 |

---

## דגשים להעברת השיעור

- הדגישו שהיררכיית catch מסודרת ספציפי→כללי היא **חובה קומפילציה**, לא רק המלצת סגנון — הדגימו את השגיאה בפועל.
- Custom Exception צריך תמיד להיקשר לתרחיש עסקי אמיתי מהדומיין (לא "דוגמה גנרית") — זה מה שהופך אותו שימושי, לא רק "עוד class שיורש מ-Exception".
- אם יש זמן, שווה להזכיר בקצרה ש-Custom Exceptions יתחברו בהמשך הקורס ל-Middleware טיפול-בשגיאות ב-ASP.NET Core.

---

## מושגים

**Exception Hierarchy** — כל החריגות יורשות מ-Exception.
**Custom Exception** — מחלקה שיורשת מ-Exception, מייצגת שגיאה עסקית ספציפית.
**`throw`** — זריקה יזומה של חריגה כשמצב לא תקין מתגלה.

---

## תרגיל חשיבה

**שאלת פתיחה:** "אתם בונים מערכת הזמנות. יש לכם `throw new Exception(\"error\")` בכל מקום שמשהו משתבש — מלאי חסר, תשלום נכשל, כתובת לא תקינה. מה הבעיה כשקוד קורא מנסה לתפוס ולהגיב אחרת לכל אחד מהם?"

**מהלך:** הובילו לתובנה: בלי סוגים ייחודיים, קוד קורא לא יכול להבדיל בין הסיבות בלי לפרש את תוכן ה-`Message` (מחרוזת חופשית, שברירה ופגיעה לשינויים). Custom Exceptions לכל תרחיש עסקי הופכים את ההבחנה לבטוחת-טיפוסים ונבדקת בקומפילציה.

**מה המרצה מראה בסוף:** הראו קוד עם `catch (Exception ex) { if (ex.Message.Contains("stock")) ... }` — פרסור מחרוזות שברירי. מיד אחר כך, אותו תרחיש עם `catch (OutOfStockException ex) { ... ex.RequestedQuantity ... }` — קומפילציה בטוחה, גישה ישירה לנתונים מובְנים.
