PracticU

טיפול בשגיאות בצד שרת - Exceptions

בלי כתוביותעם כתוביות
PracticU › קורס MVC › טיפול בשגיאות בצד שרת - Exceptions
מילון מושגים:
צד שרת - החלק של היישום שרץ בשרת ואחראי על הלוגיקה, מסדי הנתונים והעיבוד שמאחורי הקלעים.
MVC - דפוס ארכיטקטורה שמפריד יישום לשלושה חלקים: מודל (נתונים), תצוגה (View) ובקר (Controller).
חריגה - מצב שגיאה שמתרחש בזמן ריצת התוכנית ומפסיק את המהלך הרגיל, אלא אם הקוד תופס ומטפל בו.
מאפיין - תכונה שמצמידים לרכיב ומתארת אותו או את התנהגותו, למשל מאפיין של תגית HTML או שדה באובייקט.
תיקייה - מכל במערכת הקבצים שמשמש לארגון קבצים ותיקיות אחרות בתוך מבנה היררכי.
קונטרולר - רכיב שמתווך בין הממשק לבין הלוגיקה והנתונים, מקבל בקשות ומחליט כיצד לטפל בהן (למשל בדפוס MVC).
HTML - שפת הסימון שבה בונים את מבנה ותוכן דפי האינטרנט, באמצעות תגיות שמגדירות כותרות, פסקאות, קישורים ועוד.
פריימוורק - מסגרת תוכנה שמספקת מבנה וכלים מוכנים לפיתוח יישומים, כדי לחסוך כתיבת קוד חוזר.

טיפול בשגיאות בצד שרת - Exceptions
השיעור עוסק בטיפול בשגיאות בצד השרת באפליקציית MVC, כדי שהאתר לא יקרוס אלא יציג למשתמש הודעה מתאימה.
שלוש דרכים לטפל בשגיאה
1. בדיקה מראש: אם האובייקט לא קיים, למשל מוצר עם ID 100, מנתבים לפעולה ייעודית שמציגה הודעה כמו This product doesn't exist, במקום להמשיך ולגשת לערך null.
2. תפיסת החריגה: כשחריגה כבר התרחשה, מופעל מאפיין HandleError שמנתב לדף שגיאה כללי.
3. ולידציה בצד המשתמש: בדיקת הקלט לפני השליחה, למשל אימייל לא חוקי. המרצה אומר שנושא זה יילמד בסרטון נפרד.
פקודות והגדרות
1. Web.config: בתוך system.web מוסיפים customErrors עם mode="On". בלי mode On המאפיין לא פועל.
2. דף שגיאה משותף: קובץ Error בתיקייה Shared, שאליו המערכת מנתבת שגיאות שלא טופלו.
3. מאפיין HandleError: אפשר להגדיר אותו ברמת האתר (ברשימת הפילטרים הגלובליים), ברמת קונטרולר, או ברמת פעולה. אפשר גם להגדיר אותו לסוג חריגה מסוים, כמו DbUpdateException, שמנתב לדף ייעודי.
4. סטטוס 404: בתוך customErrors מוסיפים error עם statusCode="404" שמפנה לדף HTML מותאם. מאפיין HandleError מטפל רק בשגיאות 500.
טעויות נפוצות
- מחיקת מוצר שיש לו הזמנות נכשלת בדאטאבייס. בלי טיפול, המשתמש רואה דף עם פרטים טכניים על המערכת.
- מאפיין HandleError לא פועל כשה-mode אינו On.
שימו לב
- למשתמש צריך להציג הודעה ברורה ומכובדת, בלי פרטים טכניים כמו שם ה-framework או פרטי הקוד.
בסיום השיעור אתם יודעים לנתב שגיאות לדפים ייעודיים, ולהבין מתי כל דרך מתאימה.
השיעור הבא בקורס: שימוש ב-Data Annotations
מילון מושגים:
קוד מקור - הקוד שמפתחים כותבים בשפת תכנות, לפני הידור, המגדיר את פעולת התוכנה.
MVC - דפוס ארכיטקטורה שמפריד יישום לשלושה חלקים: מודל (נתונים), תצוגה (View) ובקר (Controller).

להורדת קוד מקור של כל הדוגמאות בקורס MVC – לחץ כאן


פרקי ההרצאה: טיפול בשגיאות בצד שרת - Exceptions

  1. 00:00

    למה לטפל בשגיאות בצד שרת

  2. 01:02

    בקשת מוצר שלא קיים

  3. 01:39

    NullReferenceException בדיבאגר

  4. 02:37

    שלוש שיטות לטיפול בשגיאות

  5. 03:51

    בדיקת Null ו-RedirectToAction

  6. 05:32

    Controller בשם ErrorMessages

  7. 06:31

    בדיקת דף הודעת השגיאה

  8. 07:25

    חריגה ממסד הנתונים במחיקה

תמלול ההרצאה: טיפול בשגיאות בצד שרת - Exceptions

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

  1. 00:00

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

  2. 00:20

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

  3. 00:36

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

  4. 00:48

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

  5. 01:15

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

  6. 01:38

    הנה קיבלנו חריגה והחריגה שקיבלנו זה חריגה מסוג Null Reference Exception Object Reference Not Set to an Instance of an Object והסיבה שזה קרה זה בגלל שפונקציית Details התבצעה ניסתה להביא את האובייקט הראשון שה-ID שלו זה 100 לא מצאה אובייקט כזה החזירה Null התבצעה גלישה ל-view של D-TEDs, בואו נלך ל-view, וב-view ניסינו לגשת לדוגמה Product ID.

  7. 02:15

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

  8. 02:39

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

  9. 03:03

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

  10. 03:16

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

  11. 03:38

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

  12. 04:11

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

  13. 04:40

    redirect to action בואו נמציא שם של Action שנקראת Show Error נמציא קונטרולר שנקרא Error Messages ונשלח לו אובייקט חדש שמכיל פרמטר Error Message שווה ונתאר בדיוק את השגיאה שאנחנו רוצים להציג.

  14. 05:15

    השגיאה שאנחנו רוצים להציג כרגע זה This Product Doesn't Exist. Else נציג את ה-Views סטנדרטי. כל מה שאנחנו צריכים לעשות עכשיו זה לבנות את הקונטרולר הזה שנקרא ה-errorMessages ולבנות בתוכו פונקציה שנקראת showError את זה אנחנו עושים על ידי הוספה בקונטרולר של קונטרולר חדש נקרא לו errorMessages נבנה פונקציה שנקראת

  15. 05:51

    showError הפונקציה צריכה לקבל משתנה שנקרא errorMessage זה מה שאנחנו יודעים שאנחנו שולחים לה נניח שיש לנו פה את ה-viewBag נכניס לתוך משתנה שאנחנו ממציאים errorMessage את ה-errorMessage שהתקבל ונציג את ה-view.

  16. 06:15

    אז בואו נייצר view עבור הדבר הזה, Add view, Error message, נבצע אוקיי ונציג כאן את הודעת השגיאה. הודעת השגיאה נמצאת בתוך ה-view bag, בתוך Error message.

  17. 06:36

    בואו נבדוק איך האתר מגיב כרגע. נריץ את האתר שלנו, ניגש לאיזשהו מוצר וננסה להכניס 100. וכרגע התוכנית לא קרסה אלא הגענו לאיזשהו דף שמציג להודעת שגיאה This product doesn't exist, אנחנו יכולים לחזור בחזרה ולנסות לעשות דברים אחרים.

  18. 06:56

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

  19. 07:09

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

  20. 07:25

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

  21. 07:51

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

  22. 08:06

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

  23. 08:18

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

  24. 08:28

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

לקורס המלא: קורס MVC אונליין בעברית

ההרצאה הקודמת: שימוש ב-Entity Framework - חלק 2

ההרצאה הבאה: שימוש ב-Data Annotations

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

  • טיפול בשגיאות צד שרת בנוד NodeJS
  • טיפול בשגיאות - Exception Handling
  • Error Handling - טיפול בשגיאות
  • טיפול בקריסות בצד השרת

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

  • קורס Entity Framework Core - עבודה עם מסד נתונים בדוט-נט
  • קורס דוט-נט - NET Core. - עם Rest API
  • קורס ASP.NET
  • קורס Git ו-GitHub עם Visual Studio