
This product doesn't exist, במקום להמשיך ולגשת לערך null.HandleError שמנתב לדף שגיאה כללי.system.web מוסיפים customErrors עם mode="On". בלי mode On המאפיין לא פועל.DbUpdateException, שמנתב לדף ייעודי.error עם statusCode="404" שמפנה לדף HTML מותאם. מאפיין HandleError מטפל רק בשגיאות 500.הטקסט המלא של הדקות הראשונות בהרצאה «טיפול בשגיאות בצד שרת - Exceptions» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו מגיעים לנושא חשוב של טיפול בשגיאות. יכול להיות שהמשתמש עושה איזושהי פעולה שגורמת לחריגה בצד של השרת, כלומר לשגיאת ריצה, או שפשוט הוא עשה משהו שהוא לא בסדר, שאפילו לא גורם לחריגה, ואנחנו רוצים שהתוכנית לא תקרוס במקרה של חריגה או לא תבצע משהו לא אופטימלי,
אלא להציג למשתמש איזושהי הודעה או לטפל בשגיאה באופן כלשהו. כרגע אנחנו לא טיפלנו, אנחנו רק ניגשנו לדאטאבייס והבאנו נתונים, המשתמש יכול להוסיף, אבל כמובן שיכול להיות פה כל מיני שגיאות ריצה שלא טיפלנו בהן עדיין.
כשאנחנו בונים אתר מאוד חשוב שאנחנו נטפל בשגיאות כך שהאתר שאנחנו בונים לעולם לא יקרוס, אלא יוצגו למשתמש הודעות שגיאה מתאימות. אז בואו נראה כמה דרכים לטפל בזה.
דבר ראשון, נציג את הקונטרולר שלנו ונבצע איזושהי בדיקה מה קורה אם המשתמש רוצה נניח לקבל מידע, על אובייקט שהוא לא קיים. אז בואו רגע נריץ את התוכנית ונראה מה קורה אם המשתמש ביקש לקבל מידע על איזשהו ID, בואו נניח ID 100 ואין לנו ID 100, מה קורה אם המשתמש ישלח ID 100 לתוכנית.
אז אם אנחנו מריצים ואנחנו רואים את הרשימה של המוצרים, כמובן שאין לנו פה מוצר של ID 100, אבל יכול להיות שהמשתמש בטעות יבצע דבר כזה, ינסה להגיע אפילו דרך לחיצה על הלינק, נראה שכתוב פה Products Details 1 ופשוט יגיד בוא נראה מה קורה אם אנחנו מבקשים את 100.
הנה קיבלנו חריגה והחריגה שקיבלנו זה חריגה מסוג Null Reference Exception Object Reference Not Set to an Instance of an Object והסיבה שזה קרה זה בגלל שפונקציית Details התבצעה ניסתה להביא את האובייקט הראשון שה-ID שלו זה 100 לא מצאה אובייקט כזה החזירה Null התבצעה גלישה ל-view של D-TEDs, בואו נלך ל-view, וב-view ניסינו לגשת לדוגמה Product ID.
בואו ננסה להריץ את התוכנית הזאת עם דיבאגר, ונבצע בדיוק את אותו הדבר. נראה איפה התוכנית קורסת. אז נלחץ על איזשהו מוצר, נחליף את ה-ID ל-100, נבצע Enter, ונראה אפילו שכאן המודל היה נל, הוא לא קרס כאן, הוא קרס כאן, ואם מעונן אנחנו לא יכולים להגיע לפרודקט איי-די
או לפרודקט ניים או לכל דבר אחר. איך אנחנו מטפלים בזה? אז יש בעצם כמה שיטות לטיפול בשגיאות. שיטה ראשונה תהיה פשוט לבדוק את התקינות של המידע, ואם אין רכיב כזה שאנחנו מחפשים, או אובייקט כזה, לנתב אותו להודעה שנמצאת במקום אחר.
שיטה שנייה תהיה לתפוס את החריגה ולטפל בה. זה כאשר החריגה כבר התבצעה ולא הצלחנו לפני זה לאתר אותה, ואז אנחנו גם כן יכולים לנתב לדף מיוחד שמציג שגיאות ריצה.
שיטה שלישית זה בעצם לבצע ולידציה על הצד של המשתמש. השיטה הזאתי השלישית טובה למקרה שהמשתמש מכניס ערכים בתיבות קלט, ואז הוא מכניס ערך שגוי, לדוגמה אימייל לא חוקי או שם ארוך מדי לשם מוצר, ואז הוולידטורים ימנעו את הבעיה שיכולה להתרחש.
את נושא הוולידציה אנחנו נטפל בהמשך בסרטון נפרד. אנחנו כרגע נראה את שתי השיטות הראשונות אז בואו קודם כל נבדוק שבאמת המידע קיים ואם הוא לא קיים אנחנו נפנה לדף שמציג הודעות ככה אנחנו נתפוס את השגיאה והיא לא תתרחש היא לא תקרוס אז מה שאנחנו צריכים לעשות זה טיפה לחלק את הדבר הזה לשני חלקים קודם כל ניקח פרודקט נקרא לו pro to display ונכניס לתוכו
את מה שמוחזר מהשאילתה לאחר מכן נבצע בדיקה במידה ו-prod to display הוא null אז אנחנו מעוניינים לא להחזיר את ה-view הסטנדרטי אלא לבצע גלישה ל-view אחר אחרת אנחנו כן רוצים להציג את ה-view הסטנדרטי עם המוצר הזה שחזר ולשתול אותו פה אוקיי אז איך אנחנו עושים את זה אז אנחנו רוצים במידה וזה null לבצע
redirect to action בואו נמציא שם של Action שנקראת Show Error נמציא קונטרולר שנקרא Error Messages ונשלח לו אובייקט חדש שמכיל פרמטר Error Message שווה ונתאר בדיוק את השגיאה שאנחנו רוצים להציג.
השגיאה שאנחנו רוצים להציג כרגע זה This Product Doesn't Exist. Else נציג את ה-Views סטנדרטי. כל מה שאנחנו צריכים לעשות עכשיו זה לבנות את הקונטרולר הזה שנקרא ה-errorMessages ולבנות בתוכו פונקציה שנקראת showError את זה אנחנו עושים על ידי הוספה בקונטרולר של קונטרולר חדש נקרא לו errorMessages נבנה פונקציה שנקראת
showError הפונקציה צריכה לקבל משתנה שנקרא errorMessage זה מה שאנחנו יודעים שאנחנו שולחים לה נניח שיש לנו פה את ה-viewBag נכניס לתוך משתנה שאנחנו ממציאים errorMessage את ה-errorMessage שהתקבל ונציג את ה-view.
אז בואו נייצר view עבור הדבר הזה, Add view, Error message, נבצע אוקיי ונציג כאן את הודעת השגיאה. הודעת השגיאה נמצאת בתוך ה-view bag, בתוך Error message.
בואו נבדוק איך האתר מגיב כרגע. נריץ את האתר שלנו, ניגש לאיזשהו מוצר וננסה להכניס 100. וכרגע התוכנית לא קרסה אלא הגענו לאיזשהו דף שמציג להודעת שגיאה This product doesn't exist, אנחנו יכולים לחזור בחזרה ולנסות לעשות דברים אחרים.
אבל קודם כל, שיטה ראשונה שבה אנחנו מנענו את השגיאה הזאת שראינו מקודם. עכשיו, מה קורה אם אנחנו לא מצליחים לחזות מראש איזה שגיאה יכולה להתרחש כמו שחזינו כאן?
אוקיי? בדיטיילס חזינו שוואלה, יכול להיות שהמשתמש יביא לנו משהו שלא קיים. אם הדבר הזה הוא נ"ל, אז אנחנו כמובן מציגים הודעת שגיאה. אבל יכול להיות מצב שבעצם אנחנו לא יכולים לחזות, ושגיאת ריצה יכולה להתרחש בכל מקרה.
בואו נראה דוגמא לכך. נריץ את האתר, ניכנס לאיזשהו מוצר וננסה למחוק אותו. וכאן אנחנו מקבלים חריגה שלא ממש יכלנו לתפוס אותה לפני זה, מפני שהדאטאבייס עצמו, מסד הנתונים, זרק לנו את החריגה הזאת ואומר לנו שאנחנו מנסים למחוק איזשהו מוצר שמקושר לטבלה אחרת, הוא מקושר ל-Order
Details, המוצר שאנחנו מנסים למחוק, ואנחנו לא מסוגלים למחוק מוצר כל עוד יש לו כרגע במסד נתונים הזה קישור לטבלה אחרת שמחזיקה את הרפרנס לאותו מוצר.
כלומר, למוצר שלנו יש הזמנות, אז אנחנו לא יכולים למחוק אותו אם עדיין ההזמנות קיימות. אם היינו קודם כל מוחקים את ההזמנות שלו ורק לאחר מכן מוחקים את המוצר, זה היה מסתדר.
אבל בואו נניח שזה אסור. אנחנו רוצים למחוק את המוצר, אם יש לו הזמנות לא ניתן למחוק אותן, וכל מה שאנחנו רוצים לעשות זה לתפוס את החריגה הזאת בשביל שהיא לא תקרה.
דבר כזה אסור לעולם שיקרה ואסור לעולם להציג למשתמש בכלל את הדף הזה. קודם כל הוא בכלל לא מבין מה קורה פה,