
הטקסט המלא של הדקות הראשונות בהרצאה «Exception Handling» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
הדבר הבא שאנחנו הולכים לראות ב-JavaScript נקרא Exception Handling או בעברית טיפול בחריגות. חריגה, כלומר Exception, זה בעצם שגיאה שמתרחשת בזמן ההרצה של הסקריפט שלנו ואנחנו לא רוצים בעצם שהסקריפט יקרוס ויציג הודעת שגיאה אלא אנחנו רוצים לטפל בבעיה הזאת בצורה מסוימת שמתאימה לנו.
אז בוא נניח שנייצר כרגע איזושהי שגיאת ריצה, נניח שאני רוצה להציג את המספר ABC, את המשתנה ABC. אין לי משתנה כזה. בואו נריץ, נראה מה יקרה.
אז אנחנו רואים שהתוכנית קרסה, ומה שאנחנו רואים כרגע זאת שגיאת ריצה או Exception באנגלית, והוא כותב לנו פה: Error ABC is undefined. במידה ואנחנו עדיין חושבים שיש לנו ABC ואנחנו רוצים להדפיס אותו אבל אנחנו לא ממש בטוחים, אנחנו יכולים לטפל בזה בעזרת מנגנון שנקרא מנגנון לטיפול בחריגות, או באנגלית מנגנון Exception Handling.
אז איך זה מתבצע? אז אנחנו צריכים להבין מהו הקוד שיכול לקרוס. במקרה הזה זה alert ABC. אנחנו צריכים לעטוף את הקוד הזה במילה try, כאשר אנחנו יוצרים מסביבו בלוק.
בלוק זה פתיחת סוגריים וסגירת סוגריים מסולסלות. ואז הקוד הזה שכתבנו כאן, המערכת מנסה להריץ אותו. במידה והיא מצליחה, הכל בסדר.
במידה והיא לא מצליחה והקוד קורס, אנחנו צריכים להגיע לאזור שנקרא catch. הולכים אוטומטית להגיע לאזור שנקרא catch ואנחנו יכולים בואו נציג את זה כarr לקבל בעצם את ההודעה הזאתי או השגיאה שהמערכת העלתה לנו במידה והייתה שגיאה אז אנחנו יכולים להציג את השגיאה בואו נבדוק עכשיו את התוכנית נרפרש
ונראה שהתוכנית קודם כל לא קרסה אלא עשתה את מה שאנחנו אמרנו לה ומה שאמרנו לה זה להציג הודעת שגיאה יכלנו כמובן גם להתעלם ולא לעשות כלום.
טייפ ארור ABC is undefined. אותה הודעה שמקודם ראינו אבל שגרמה לקריסה וזה דבר לא רצוי מבחינת המשתמש, כרגע מוצגת לנו בהודעה רגילה ותמימה ומאפשרת לתוכנית להמשיך לרוץ בהצלחה.
אם היה לנו סקריפט אחרי זה הסקריפט היה רץ בלי שום בעיה. אוקיי, מה היה קורה אילו לא הייתה בכלל שגיאה? בוא נניח שאכן היה לי פה מוגדר var ABC שווה 123. כעת לא אמורה להיות בכלל שגיאה האם אזור הcatch יתבצע והוא יציג לי משהו שקשור לשגיאה ובואו נראה את זה נרפרש ואנחנו רואים שהוא נכנס לתוך אזור הtry מציג לנו את ההודעה ומסיים
בואו ננסה להציג כאן עוד דבר מסוים ואנחנו רואים שהצגנו כאן הודעה שאנחנו אחרי כל הבלוק הזה של הtrycatch בואו נריץ נראה שהוא מציג 1,2,3 ממשיך הלאה מציג לנו את ההודעה בואו כרגע נוריד את הvar ABC, נריץ, נראה שהוא מציג לנו את הודעת שגיאה וממשיכה לה ל-I'm after the try catch.
עכשיו, במידה ולא היה לנו בכלל try catch, אז כעת אם אנחנו נריץ את זה אנחנו אמורים לקבל פה שגיאה. השאלה היא האם הוא יציג את האלרט הזה. בואו נריץ, נראה שחטפנו חריגה, זה משהו שהלקוח לא אמור לראות בכלל אפילו לא פעם אחת.
אנחנו לוחצים על no, והתוכנית בעצם לא מבצעת שום דבר ולא ממשיכה הלאה, שאם הייתה חריגה איפשהו, אז הדפדפן יכול פשוט להפסיק ולא להמשיך הלאה את הקוד שלו, את הסקריפט, ויכול להיות שדפדפן אחר כן יחליט להמשיך הלאה, אנחנו לא ממש יכולים לדעת איך הדפדפנים יגיבו
וגם איך דפדפנים בעתיד יגיבו. יש לנו פה את היכולת ללחוץ על no, שאנחנו לא רוצים לדבג את הבעיה הזאתי, גם אם היינו לוחצים על yes, בעצם היינו פותחים כאן איזשהו דיבאגר בשביל להבין מה בדיוק הייתה הבעיה, אבל כרגע אנחנו לא נתעסק עם זה.
נחזור בחזרה, נחזיר את ה-tribe ואת ה-catch כי הוא עזר לנו להיפטר מהבעיה, להציג הודעת שגיאה מתאימה ואחר כך גם להמשיך את הסקריפט מפני שהתוכנית לא באמת קרסה.
אוקיי, דבר נוסף שיש לנו במנגנון הזה נקרא finally. פיינלי נכתב אחרי הקאץ' והוא מתאר אזור קוד שהולך לרוץ בכל מקרה גם אם הייתה שגיאה וגם אם לא הייתה שגיאה.
בדומה למה שהיה לנו כאן אבל יותר מקצועי לעשות את זה בפיינלי אם אנחנו רוצים שבכל מקרה הקוד שלנו ירוץ.
בואו נציג פה alert I'm in the finally. אוקיי אז כרגע נכתוב קוד שלא אמור לקרוס. יש לנו פה משתנה ABC אנחנו מציגים אותו ב-try ויש לנו פה קאץ' ופיינלי.
בואו נריץ את זה. אנחנו רואים שהטריי מתבצע בלי בעיה ויש לנו את ההודעה שנמצאת בפיינלי. בואו נחזור, נייצר שגיאה, נוריד את ה-abc, אנחנו רואים שהגענו לאזור של ה-catch, הצגנו טייפ-ארור וגם כאן הפיינלי מתבצע.
פיינלי מיועד לביצוע קוד שאנחנו רוצים שהוא תמיד תמיד תמיד ירוץ, לא משנה אם הייתה שגיאה או לא הייתה שגיאה. זה בדרך כלל דברים שאנחנו רוצים לבצע בוודאות כמו הודעות למיניהם, ביצוע UI כלשהו שאנחנו רוצים שתמיד יתבצע, להגיע לדף מסוים אם אנחנו תמיד רוצים, לסגור כל מיני קישורים
שפתחנו, דברים שאנחנו בוודאות רוצים לעשות. אוקיי, בואו ננסה עכשיו להציג מידע אחרי ה-Alert ABC, ואת ההודעה שאנחנו מציגים זה The End of the Try.
אנחנו רוצים לראות מה קורה אם אין שגיאה. אז אם אין שגיאה, כמובן שה-Alert ABC יצליח, וכמובן ש-Alert the end of the try גם הוא אמור להיות מוצג.
בואו נבדוק את זה. יש לנו את ה-Alert ABC ומיד אחריו יש לנו the end of the try וכמובן ה-finally אמור להתבצע בכל מקרה. אבל מה שאני מנסה להדגים עכשיו זה מה קורה אם יש שגיאה.
במקרה ויש שגיאה, אז השגיאה הולכת להתבצע ב-Alert ABC כי המשתנה ABC לא מוגדר. ברגע שזה קורה אנחנו אמורים מיידית לצאת החוצה מה-try ולהגיע ל-catch.
זאת אומרת שכל מה שנמצא אחרי השגיאה בתוך ה-try לא יתבצע. בואו נראה את זה. אנחנו רואים שמיידית הגענו ל-catch בלי בכלל לבצע את הקוד שאחרי ה-try, וכמובן הפך להתבצע.
מה קורה אם יש לנו קוד לפני השגיאה? אז חשבנו פה שאנחנו נמצאים בהתחלה של ה-try. בואו נבדוק. אנחנו רואים שהקוד כן מתבצע כרגיל. I'm in the beginning of the try.
ברגע שאני מגיע למצב של שגיאה המערכת מיידית עוצרת וקופצת לאזור של הקאץ' שהתפקיד שלו הוא אחד ויחיד וזה לטפל בשגיאה שהייתה. מפני שאם לא הייתה שגיאה אנחנו לא אמורים להגיע בכלל לקאץ'.
בואו נסתכל עוד פעם מה קרה כאן. הקוד הזה לא קרס ולכן הדפדפן הריץ אותו. הקוד הזה כן קרס ולכן הדפדפן מיידית קפץ לכאן ודילג על כל מה שאחרי הקריסה. כאן אנחנו בעצם אמורים לטפל בבעיה שקרתה ובמקרה הזה הצגנו דעת שגיאה.
פיילינינג יתבצע בכל מקרה אם אנחנו רוצים. בואו נראה דוגמה יותר ממשית לשימוש ב-Exception Handling. לצורך כך בואו נפתח דף html חדש, יש לנו פה html open, נגדיר פה סקריפט language javascript type text javascript ונגדיר קצת UI. מה שאנחנו רוצים לעשות זה לאפשר את הדבר הבא.
אנחנו רוצים להגיד למשתמש enter, ואנחנו רוצים שהוא יוכל להכניס את המספר על ידי איזושהי תיבת טקסט input type שווה טקסט ניתן לה id.txt.num עכשיו אנחנו רוצים לעשות