PracticU

טיפול בחריגות - Exception Handling

בלי כתוביותעם כתוביות
PracticU › קורס תכנות מונחה עצמים - OOP - Object Oriented Programming - חומר לימוד של מדעי המחשב › טיפול בחריגות - Exception Handling
מילון מושגים:
חריגה - מצב שגיאה שמתרחש בזמן ריצת התוכנית ומפסיק את המהלך הרגיל, אלא אם הקוד תופס ומטפל בו.
פונקציה - קטע קוד בעל שם שמבצע משימה מוגדרת, מקבל ערכי קלט (פרמטרים) ויכול להחזיר תוצאה. מאפשרת לארגן קוד ולהשתמש בו שוב.
קומפיילר - תוכנה שממירה קוד מקור שנכתב בשפת תכנות לקוד שהמחשב יכול להריץ, ומדווחת על שגיאות תחביר.
פרמטר - ערך שמועבר לפונקציה או לפקודה כקלט, ומשפיע על אופן פעולתן ועל התוצאה שהן מחזירות.
אובייקט - יחידה בתכנות מונחה עצמים שמאגדת נתונים (תכונות) ופעולות (מתודות). נוצר בדרך כלל ממחלקה המשמשת כתבנית.
מערך - מבנה נתונים שמאחסן אוסף ערכים מאותו סוג ברצף, שאפשר לגשת אליהם לפי מספר מיקום (אינדקס).
מחלקה - תבנית בתכנות מונחה עצמים שמגדירה אילו נתונים ופעולות יהיו לאובייקטים שנוצרים ממנה.

טיפול בחריגות - Exception Handling
השיעור מסביר טיפול בחריגות (Exception Handling): איך מזהים שגיאה שגורמת לקריסה, איך זורקים חריגה מתוך פונקציה ואיך תופסים אותה כך שהתוכנית לא תיפול.
שלושה סוגי שגיאות
1. שגיאת קומפילציה: הקומפיילר מסמן את המקום המדויק ומסביר מה קרה, והתוכנית לא רצה עד שמתקנים אותה. כדאי לתקן מיד, כי שגיאות מצטברות, ולפעמים האינטליסנס מפסיק לעבוד.
2. שגיאת ריצה (חריגה): השגיאה מתרחשת בזמן ההרצה וגורמת לקריסה. לדוגמה, Convert.ToInt32 שמקבל את הקלט abc.
3. שגיאה לוגית: התוכנית לא קורסת, אבל התוצאה שגויה, למשל חישוב שמוסיף בטעות 1 לתוצאה. זו השגיאה הקשה ביותר לאיתור, ואין לטפל בה בעזרת חריגות, אלא בבדיקה ובבדיקות איכות.
זריקת חריגה
1. בדיקת הקלט: הפונקציה בודקת את הפרמטר שהתקבל מבחוץ. אם הוא לא חוקי, היא לא ממשיכה ומעלה חריגה בעזרת throw.
2. סוג החריגה: החריגה היא אובייקט מטיפוס Exception או נגזרת שלו. כדאי לזרוק את החריגה המדויקת ביותר, למשל ArgumentNullException כשהמערך הוא null, ו-ArgumentException כשהוא ריק.
3. דוגמה: הפונקציה getAverage מקבלת מערך ריק. במקום לחלק באפס ולקבל אינסוף, היא זורקת חריגה עם הודעה מתאימה.
טיפול בחריגה
1. try: עוטף את הקוד שקורא לפונקציה. אם לא נזרקה חריגה, הבלוק מסתיים בהצלחה.
2. catch: תופס את החריגה לפי הסוג שלה ומציג הודעה למשתמש. אפשר לכתוב כמה catch לסוגים שונים.
3. סדר הקאצ'ים: catch כללי מסוג Exception חייב לבוא אחרון, כי הוא תופס הכול.
4. finally: הבלוק הזה מתבצע תמיד, בין אם הייתה חריגה ובין אם לא, וגם אם יש return בתוך try או catch. לכן מתאים לשחרור משאבים.
שימו לב
במחלקה אפשר להגדיר חריגה משלה שיורשת מ-Exception. לדוגמה, IllegalGradeException נזרקת בתוך ה-set של ציון שאינו בין 0 ל-100. מי שמשתמש במחלקה יכול לתפוס בדיוק את הבעיה הזאת, ולהציג הודעה ברורה במקום קריסה. כעת אפשר לכתוב קוד שמזהה קלט לא חוקי, מעלה חריגה מדויקת, ומטפל בה בלי שהתוכנית תיפול.
השיעור הבא בקורס: מצביע לפונקציה - Delegate

פרקי ההרצאה: טיפול בחריגות - Exception Handling

  1. 00:00

    שלושת סוגי השגיאות

  2. 02:54

    שגיאת ריצה וקריסה

  3. 06:50

    בניית פונקציית GetAverage

  4. 11:12

    הסיבה לקריסה והעלאת חריגה

  5. 15:06

    בדיקת תקינות הפרמטר

  6. 16:07

    זריקת חריגה עם throw

  7. 18:15

    טיפול בחריגה עם try ו-catch

  8. 22:15

    חריגות ספציפיות וריבוי catch

תמלול ההרצאה: טיפול בחריגות - Exception Handling

הטקסט המלא של הדקות הראשונות בהרצאה «טיפול בחריגות - Exception Handling» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:01

    אנחנו מגיעים לנושא סופר חשוב בעולם פיתוח התוכנה שבעצם קיים בכל תוכנית שאנחנו כותבים. הנושא הזה אנחנו יכולים לראות אותו עכשיו רק אחרי שאנחנו באמת מבינים Object Oriented והנושא הזה נקרא Exception Handling, כלומר טיפול בחריגות.

  2. 00:20

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

  3. 00:37

    סוג ראשון נקרא שגיאת קומפילציה. נניח שאנחנו פותחים פה int x שווה 8 ומריצים את התוכנית. אז אנחנו באים להריץ את התוכנית או לבנות ממנה קובץ Execution ואנחנו רואים שהתוכנית כותבת לנו נקודה פסיק אקספקטד.

  4. 00:56

    אז השגיאה הזאת זה כמובן שגיאה שהתרחשה אבל היא לא התרחשה במהלך הריצת התוכנית, היא התרחשה במהלך הקומפילציה כלומר התהליך שבו visual studio או יותר נכון מנגנון הקומפיילר קורא את הקוד שלנו ומנסה ליצור ממנו קובץ אקסקיושן אז אם יש לנו שגיאת תחביר אז כמובן שהמנגנון הזה מצליח להבין שטעינו ומיד לסמן לנו את המקום המדויק פגיעה נוספת אנחנו יכולים לנסות להדפיס

  5. 01:29

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

  6. 01:52

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

  7. 02:07

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

  8. 02:27

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

  9. 02:49

    הסוג השני זה שגיאות שנובעות בריצת התוכנית ובעצם גורמות לתוכנית לקרוס. בואו ניקח דוגמא. נניח שיש לנו פה איזשהו משתנה num, ואנחנו לפני זה באים ואומרים למשתמש enter number.

  10. 03:12

    לעת אנחנו רוצים לגשת ולקלוט איזשהו מספר וכמובן להפוך אותו על ידי convert למספר ובואו נניח שנציג איזושהי הודעה שהמספר כפול עצמו שווה לאיזשהו ערך יש לנו פה num, באמת שאפשר לעשות דבר כזה, num כפול num דבר ראשון בואו נריץ ונראה שהכל עובד כמו שצריך אם אנחנו מכניסים 12 אז

  11. 03:56

    אנחנו רואים ש-12 כפול 12 שווה 144 בסדר, אבל מה קורה אם המשתמש מריץ ומכניס 12 ובטעות לחץ על A או לא בטעות או לא הבין מה הוא רוצה להכניס?

  12. 04:12

    ואנחנו רואים את הדבר הזה. והדבר הזה זה שגיאה שהתרחשה במהלך הריצה שגרמה לתוכנית לקרוס. כרגע התוכנית בעצם קרסה ואם אנחנו נפסיק את החלון הזה, זה לא משנה אם אנחנו נלחץ yes או no, אז התוכנית בעצם תפסיק.

  13. 04:33

    וזאת שגיאת ריצה, או במילים אחרות חריגה, באנגלית exception. אז הטיפול בשגיאות כאלו הוא מנגנון מיוחד שאנחנו הולכים לראות בסרטון הזה שנקרא מנגנון טיפול בחריגות, מנגנון exception handling.

  14. 04:51

    הסוג השלישי של השגיאות שקיימות זה שגיאות לוגיות. שגיאה לוגית זה שגיאה שלא גורמת לתוכנית לקרוס, אבל ישנה איזושהי שגיאה שם.

  15. 05:04

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

  16. 05:42

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

  17. 06:00

    והבאגים האלה יכולים להיות כאלה שהם נסתרים ותוכניות יכולות להכיל אותם אף אחד לא רואה אותם פשוט תוכניות שנותנות תוצאות שגויות. אז בגלל שהבאג הזה לא גרם לתוכנית לקרוס אז לא מטפלים בו על ידי שגיאות של exception handling טיפול בחריגות כי אין פה חריגה השיטה הכי טובה למנוע שגיאות כאלה זה פשוט לא לעשות אותן או שאפשר פשוט לרוץ עם דיבאגר שלב שלב ולחפש

  18. 06:30

    אותן או לקחת מישהו שבודק את התוכנית בארגונים יש יחידה שנקראת יחידת qa quality assurance שהתפקיד שלהם זה גם לחפש שגיאות כאלה ולהתקיל את התוכניות שהמתכנתים עשו ואז רק אפשר למצוא ולתקן אותן אז אנחנו הולכים בסרטון הזה לטפל

  19. 06:51

    שגורמות לקריסת התוכנית. בואו ניפטר ממה שעשינו פה וכעת נלך ונצרף איזשהי קלאס והמחלקה שאנחנו הולכים לצרף נקראת array services ואנחנו רוצים לבנות איזושהי פונקציה, זו לא פונקציה סטטית שנקראת get average היא מקבלת איזשהו מערך, רצה עליו, סוכמת את כל האיברים שלו ומחזירה

  20. 07:52

    תחום האיברים לחלק לאורך של המערך וזה נותן לנו את ממוצע איברי המערך. כעת אנחנו רוצים לגשת ולהשתמש עם הפונקציה. זה אומר שאנחנו צריכים לבנות איזשהו מערך.

  21. 08:09

    בואו נבנה פה פרייט, נציג את הממוצע שלו, נריץ ונראה שהממוצע זה 44. עכשיו אנחנו זוכרים שמי שכותב את המחלקה זה לא מי שמשתמש בה, ויכול להיות שמישהו עכשיו ישתמש במחלקה הזאת וישלח את המערך הבא.

  22. 08:56

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

  23. 09:32

    הקונסול לא מצליח להציג עברית אז אנחנו רואים את הג'יבריש הזה אבל אנחנו רואים שיש פה איזושהי בעיה שקרתה והיא עדיין לא גרמה לקריסת התוכנית אבל מה אנחנו עושים בשביל לטפל בה?

  24. 09:52

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

  25. 10:10

    בדוגמה הזאת ביקשנו מהיוזר להכניס מספר, היוזר הכניס מספר שהוא שגוי או לא מספר בכלל, הוא הכניס איזושהי מכרוזת וההכנסה של המכרוזת גרמה לקריסת התוכנית.

  26. 10:24

    אז אם נחקור מה קרה כאן בעצם אז נראה שconsole readline החזירה מחרוזת ולא מספר convert to int 32 לא הצליחה להמיר את המחרוזת למספר אמיתי ולכן היא גרמה לקריסה מי שגרם לקריסה זאת הפונקציה to int 32 אם אנחנו נריץ את זה ונכניס abc אנחנו נראה שיש פה קריסה עכשיו למה אני מתכוון כשאני אומר שאנחנו הולכים ללמוד את

  27. 10:55

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

  28. 11:17

    אז ראינו שמי שיזם את הקריסה זאת הפונקציה toInt32. הסיבה שהיא יזמה את הקריסה היא כי היא מצפה לקבל מכרוזת שמתארת מספר והיא קיבלה מכרוזת שלא מתארת מספר.

  29. 11:33

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

  30. 12:02

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

  31. 12:22

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

  32. 12:55

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

  33. 13:30

    ככה ונכון לעבוד בפיתוח תוכנה Object Oriented. עכשיו אם אנחנו חוזרים בחזרה לדוגמה שראינו יש לנו פה משהו שהוא לא כל כך אופטימלי.

  34. 13:46

    יש לנו את הפונקציה getAverage שאנחנו כתבנו והיא בכלל לא בודקת אם הערך שהיא קיבלה הוא חוקי או לא חוקי ולכן היא הרשתה להחזיר איזשהו ערך שהוא לא בסדר.

  35. 14:04

    אם אנחנו נריץ את זה אנחנו נראה שחזרנו הג'יבריש הזה כרגע שבסך הכל זאת המחרוזת אין סוף בעברית. טוב, אז מה אנחנו עושים?

  36. 14:19

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

  37. 14:41

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

  38. 15:06

    ואנחנו עכשיו צריכים לבדוק האם המערך שקיבלנו הוא ריק. ומערך ריק זה אומר שאו המערך זה נ"ל, מבחינתי זה לא בסדר, אי אפשר להביא לי מערך או כתובת של מערך שלא מצביעה באמת על מערך אמיתי ולצפות לקבל ממוצע, שכן הביאו מערך כמו במקרה הזה שלנו אבל הלנקס שלו הוא 0. בשני המקרים האלה אני לא מוכן

  39. 15:36

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

  40. 16:02

    בבעיה על ידי טיפול בחריגות שאנחנו עוד מעט הולכים לראות איך הוא יעשה את זה. איך אנחנו גורמים לקריסה יזומה? והמילה הראשונה שאנחנו הולכים ללמוד במנגנון הזה נקראת throw.

  41. 16:17

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

  42. 16:49

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

  43. 17:10

    אז אם אנחנו עכשיו זורקים exception אנחנו יכולים בקונסטרקטור של האובייקט לתאר מה הבעיה. נניח הרי can't be empty. במידה ופונקציה יש בה את המילה throw והתוכנית מגיעה למילה throw היא לא תמשיך הלאה ומיד תגרום לקריסה.

  44. 17:42

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

  45. 18:07

    אז איך אנחנו מטפלים בבעיה? טיפול בבעיה מכיל מספר מילים שמורות. המילה הראשונה זה try. try זאת מילה שמכילה בלוק שעוטף את כל הקוד שמנסה לקרוא לפונקציה שלנו ולפונקציות אחרות.

  46. 18:28

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

  47. 18:47

    המשתנה הזה זה האובייקט שנזרק. שימו לב שכאן אנחנו יצרנו אובייקט חדש עם המילה new ופה אנחנו תופסים אותו. אז אחד מהדברים שיש לו זה message. מסג' זאת בעצם החרוזת שמתארת מה הבעיה עם השגיאה שקרתה כרגע.

  48. 19:12

    בואו נריץ, ונראה שעכשיו התוכנית לא קורסת אלא מוצגת הודעה חוקית על המסך, הרי can't be empty.

  49. 19:21

    בעצם האזור קוד של הפונקציה בדק את הפרמטר שהוא קיבל מבחוץ, במידה והוא לא היה בסדר הוא זרק חריגה, האזור קוד שמשתמש איתו טף אותו בבלוק טריי, בלוק קאץ' טיפל בחריגה.

  50. 19:41

    במידה ואין שום חריגה בלוק ה-try מצליח להסתיים בהצלחה. בואו נרשום פה end of try. אז אנחנו אמורים לראות את ה-end of try כי לא הולכת להיות פה שום חריגה ובנוסף בלוק ה-catch בכלל לא הולך להתבצע.

  51. 20:04

    בואו נריץ ונראה שיש לנו הצגה של הממוצע ו-end of try. במידה והייתה חריגה, בואו נחזיר את זה, מיידית תתבצע קפיצה לבלוק קאץ' המתאים שיש.

  52. 20:19

    כאן אנחנו רואים שיש throw, המערכת תצא מהפונקציה, תחזור לפקודה הזאת ומיד תקפוץ מעל כל הקוד שיש אחריה עד שהיא תיכנס לבלוק קאץ' מתאים ותבצע את הבלוק קאץ'.

  53. 20:39

    בואו נריץ ונראה שלא מוצג לנו ה-end of try כי המערכת דילגה עליו. זה אומר שמה שאנחנו עושים בתוך בלוקי הcatch שאנחנו כותבים זה אך ורק טיפול בבעיה שקרתה מפני שאם לא הייתה שום בעיה אנחנו לא נגיע לשום בלוק catch ואם הגענו לבלוק catch בוודאות הייתה איזושהי קריסה ולכן אנחנו צריכים לטפל בה וזה המטרה של בלוקי הcatch

  54. 21:06

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

  55. 21:32

    פה אנחנו הולכים לראות למה בעצם עלינו לזרוק את החריגה הכי מדויקת שיכולה להיות. אז קודם כל אנחנו רואים שיש לנו כאן throw new exception וראינו ש-exception זה המחלקה הכי גבוהה של כל מחלקות החריגה זאת מחלקת ה-bethith של כל החריגות אז היא בעצם לא מתארת באמת חריגה ספציפית אלא מתארת חריגה מאוד מאוד כללית שיכולה להיות.

  56. 21:59

    אז למה אנחנו צריכים לברוק חריגות ספציפיות? והסיבה היא בכדי לתת אפשרות למי שמשתמש בפונקציה שלנו לכתוב מספר קאצ'ים בכדי לטפל באופן שונה בסוגים שונים של חריגות.

  57. 22:20

    זאת אומרת מי שכותב את המחלקה יכול עכשיו או יותר נכון מי שמשתמש במחלקה הוא יכול עכשיו לכתוב מספר קאצ'ים. בואו נראה איך זה מתבצע. אנחנו כאן יכולים לבדוק דבר ראשון האם הרי הוא נאל.

  58. 22:39

    אם מישהו שלח לי נאל אני רוצה לזרוק טיפוס שנקרא נאל, או יותר נכון ארגיומנט נאל אקספצ'ן. ארגיומנט זה מילה שמתארת משתנה שנשלח לפונקציה.

  59. 23:03

    ארגיומנט נאל אקספצ'ן זה טיפוס שהוא אקספצ'ן שהוא יותר ספציפי ואומר יש לי איזשהו ארגומנט בפונקציה הפרמטר name שלו נקרא arr ומישהו שלח לי null ואז במידה ולא אנחנו נמשיך בתוכנית ואנחנו בודקים האם הוא בעל length 0 אם כן יש לנו את argument exception argument exception מתאר בעיה כללית עם פרמטר

  60. 23:40

    כאן אנחנו יכולים לשלוח הרי can't be null can't be empty בסדר אז עכשיו יש לנו פה שתי זריקות שונות אם שלחו לי פרמטר שהוא נל הוא לא מצביע בכלל על מערך אז הזריקה שאני זורק כרגע throw new argument null exception והיא מציינת שוואלה הביאו לי נל ואסור להביא לי נל במידה והביאו לי מערך ריק שזה לא נל זה מערך פשוט באורך 0 ואני זורק argument exception קצת יותר מדויק בכל מקרה אני לא זורק פה כרגע

  61. 24:19

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

  62. 24:36

    בואו נשלח נאל. במקום הרי פשוט נשלח נאל. אנחנו רואים שיש לנו value can't be null, פרמטר name הרי, שוב פעם.

  63. 24:50

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

  64. 25:08

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

  65. 25:33

    ואין שום בעיה לשלוח אובייקט מנאג'ר לפונקציה שמקבלת פרסון. אין שום בעיה לשלוח אובייקט לדוגמה אמפלואי לפונקציה שמקבלת אובג'קט.

  66. 25:42

    מפני שאם יש לנו את הבסיס הוא יכול לתפוס גם אובייקטים שהם נגזרות. אז זאת הסיבה שיותר קל לנו להבין כרגע למה אנחנו יכולים לזרוק כל מיני סוגי חריגות ולתפוס את כולם עם אקספצ'ן.

  67. 26:02

    כי היא הבסיס של כל האקספצ'נים שיש. בואו נריץ את כל התוכנית הזאת עם דיבאגר. יותר קל להבין מה קרה פה אני בעצם מריץ את התוכנית אני עוצר בנקודת העצירה ונכנס לתוך הפונקציה עם f11 נכנס לתוך הפונקציה ממשיך בתוכנית ואני רואה שקיבלתי איזשהו מערך והגודל שלו זה 0 אז הוא כמובן לא שווה ל-null אז אנחנו ממשיכים הלאה ואנחנו בודקים האם ערכו שווה

  68. 26:33

    0 בואו נשים את העכבר על הלנקס נראה שהוא 0 ניכנס לתוך ה-if ונגיע ל-throw ברגע שהגענו ל-throw התוכנית בעצם קופצת מיידית ואנחנו רואים שדילגנו על כל הקוד הזה ועל כל ה-Consol right line ועל כל מיני דברים אחרים דילגנו על הכל לא המשכנו בכלל את הפונקציה מיד התוכנית יצאה והתחיל לחפש catch שמסוגל לטפל בבעיה והcatch הזה אכן מסוגל לטפל בבעיה אם אנחנו

  69. 27:09

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

  70. 27:34

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

  71. 27:55

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

  72. 28:11

    זרקנו סוגים שונים של בעיות כתלות בבעיות שיכולות לנבוע מהפרמטר שהתקבל. אבל מי שטיפל בבעיה פשוט החליט לטפל בכל האקספשנים שיכולים להיזרק בתוכנית הזאת באותו האופן והוא יכל גם להחליט לבצע קאצ'ים אחרים.

  73. 28:31

    איך עושים את זה? אומרים כזה דבר: במידה ומישהו זורק לי argument null exception אני רוצה להציג איזושהי הודעה ספציפית שאומרת you can't send null.

  74. 28:54

    במידה ומישהו שולח לי argument exception אז אני רוצה להציג בוא נניח את הודעת שגיאה שהגיעה מהמסג'. במידה ויש לי חריגה כללית, אז אני רוצה להציג, בואו נניח ג'נרל אירו.

  75. 29:23

    שימו לב שבקאצ' הראשון לא השתמשתי עם האובייקט שנזרק במיטה, ואני לא משתמש עם האובייקט שנזרק, אני לא חייב לרשום אותו בקאצ', אני יכול לרשום דבר כזה.

  76. 29:36

    בואו נריץ כרגע ונראה שהוא מציג לנו את ה-array can't be empty, אבל בואו נסתכל על זה עם דיבאגר. אני מריץ, אני נכנס לתוך הפונקציה, אני רואה שהוא הולך לזרוק בגלל שיש לי מערך ריק, וה-catch המתאים שהולך להיתפס זה argument exception בגלל שנזרק argument exception.

  77. 30:04

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

  78. 30:23

    נריץ את התוכנית עם F5, נעצור בבריק פוינט, ניכנס לפונקציה, נראה כעת שיש לנו האם הרי שווה נל תשובה כן אנחנו הולכים לזרוק ארגיומנט נל אקספצ'ן ולתפוס אותו עם הקאצ' של הארגיומנט נל אקספצ'ן בדיוק מה שקרה עכשיו אנחנו מציגים you can't send null בואו נסתכל במה שיש לנו

  79. 30:48

    זאת אומרת שמי שמטפל בבעיה יכול להבין שיש כל מיני בעיות שיכולות לנבוע מהפונקציה שאנחנו מטפלים בה ולכתוב לעצמו כל מיני קאצ'ים עכשיו, מאיפה זה שמטפל בבעיה יודע שהמחלקה או הפונקציה הזאת זורקת ספציפית ארגימנט מעלה?

  80. 31:14

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

  81. 31:39

    ואומר Getting average from an int array Parameter name array, the array, to

לקורס המלא: קורס תכנות מונחה עצמים OOP

ההרצאה הקודמת: המחלקה Object

ההרצאה הבאה: מצביע לפונקציה - Delegate

הרצאות קשורות מקורסים אחרים

  • Exception Handling
  • טיפול בשגיאות - Exception Handling
  • טיפול בחריגות - NodeJS Exceptions
  • Error Handling - טיפול בשגיאות

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת C# .NET - קורס תכנות למתחילים - דוט-נט / סי-שארפ - חומר לימוד של מדעי המחשב