PracticU

טיפול בקריסות בצד השרת

בלי כתוביותעם כתוביות
PracticU › קורס דוט-נט - NET Core. - עם Rest API › טיפול בקריסות בצד השרת
טיפול בקריסות בצד השרת
מה עושים כשהשרת עצמו קורס ומחזיר שגיאת 500? הסרטון מראה איך להחזיר ללקוח הודעה משלנו במקום הודעת מערכת, ואיך לתפוס את כל החריגות במקום אחד במקום לכתוב try catch בכל route.
השלבים העיקריים
1. יצירת תקלה: ב-connection string משנים את trusted connection ל-false בלי להגדיר שם משתמש וסיסמה. בקשה לכל הספרים מחזירה 500 (internal server error) עם הודעה שאנחנו לא רוצים שהלקוח יראה.
2. מחלקת שגיאה: מכפילים את המחלקה האחרונה בקובץ ה-errors ל-internal server error, שמקבלת message ומעבירה אותו ל-base.
3. try catch ב-route: עוטפים את הקוד, ובחריגה מחזירים JsonResult עם אובייקט השגיאה (ההודעה של החריגה) ו-StatusCode מתוך status codes, שהוא 500 (internal server error). הלקוח מקבל את האובייקט שלנו והשרת לא קורס.
4. בלי try catch בכל route: כותבים פילטר ברמת האפליקציה, CatchAllFilter שמממש את IExceptionFilter. הפונקציה OnException מקבלת context, ובה אותו קוד: context.Exception.Message, יצירת JsonResult, הצבתו ב-context.Result, ו-context.ExceptionHandled = true כדי לומר ל-dotnet שהחריגה טופלה כאילו נתפסה ב-catch. חריגה שטופלה לא מגיעה אליו, ורק חריגות שלא טופלו מתנקזות לשם.
5. רישום הפילטר: בהתחלה זה לא עבד כי שכחנו לרשום אותו. הוסיפו אותו ב-AddMvc דרך options.Filters.Add<CatchAllFilter> כך שיחול על כל ה-controllers. אחר כך אפשר למחוק את ה-try catch.
6. החריגה הפנימית ביותר: ההודעה שהוצגה ("likely due to transient failure") לא תיארה את הבעיה האמיתית, שהיא שם משתמש וסיסמה. לפעמים קוד אחד תופס חריגה וזורק חריגה אחרת, ואז המקורית נשמרת ב-inner exception. לכן כותבים פונקציה רקורסיבית GetInnerMessage: אם החריגה null מחזירה מחרוזת ריקה, אם אין InnerException מחזירה את ההודעה, ואחרת קוראת לעצמה עם ה-inner. תוצאה: "No process is on the other end of the pipe", הודעה פנימית יותר שאפשר לחפש בגוגל.
שימו לב
400 ומעלה הוא שגיאת לקוח, ו-500 אומר שהייתה בעיה בשרת. אל תחשפו ללקוח הודעות חסויות, וקבעו בעצמכם מה חוזר.
אחרי הסרטון תוכלו לתפוס כל חריגה שלא טופלה במקום אחד, ולהחזיר ללקוח הודעת 500 שמבוססת על החריגה הפנימית ביותר.

פרקי ההרצאה: טיפול בקריסות בצד השרת

  1. 00:00

    טיפול בשגיאת קריסה 500

  2. 00:38

    יצירת קריסה דרך ה-connection string

  3. 01:17

    הסתרת מידע חסוי מהלקוח

  4. 02:16

    עטיפת הקוד ב-try catch

  5. 02:59

    החזרת JsonResult עם status code

תמלול ההרצאה: טיפול בקריסות בצד השרת

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

  1. 00:02

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

  2. 00:16

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

  3. 00:28

    אנחנו לא צריכים להגדיר איזשהו, אה, שם משתמש וסיסמה עבור הדאטה בייס הזה, כי trusted connection שווה true. והפרויקט רץ והכול בסדר וכולם עובדים. יום בהיר אחד מישהו שנמצא בשרת ויש לו גישה לקובץ הזה בא ואומר "וואלה, אני כן רוצה להגדיר username ו-password", משנה לי את זה ל-false אבל לא מגדיר שם משתמש וסיסמה.

  4. 00:56

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

  5. 01:05

    אז בואו נריץ רגע Ctrl F5 ונלך ל-Postman וננסה פשוט להביא את כל הספרים. ואנחנו רואים שיש לנו, אה, קריסה חמש מאות. אז קודם כל זה מעולה שקיבלנו בחזרה חמש מאות, זה internal server error.

  6. 01:23

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

  7. 01:33

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

  8. 01:44

    אז מה עושים? בואו נחזור לפה. ניגש ל-errors, אה, נשכפל את האחרון ל-internal server error. internal server error.

  9. 01:57

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

  10. 02:19

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

  11. 02:40

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

  12. 03:04

    JSON Result זה אובייקט שאנחנו יכולים לייצר שאומר לי "תקשיב, תביא לי איזה JSON שאתה רוצה, אני אחזיר אותו ותגיד לי גם מה ה-status code שאתה רוצה להחזיר". נותן לי יותר שליטה כזאת, כי אין לנו משהו ייעודי לגבי זה.

  13. 03:18

    אז נייצר JSON Result. JSON Result, הנה זה, שווה new JSON Result וניתן לו פה את האובייקט שאנחנו רוצים. האובייקט שאנחנו רוצים זה אותו אובייקט שגיאה שהיה.

  14. 03:30

    בואו נייצר אותו פה וקראנו לו internal server error new. נגיד לו ex message זאת הודעת השגיאה של החריגה שהתבצעה. תן לי רק את ההודעה ואני נותן לך פה את

לקורס המלא: קורס דוט-נט - NET Core. - עם Rest API

ההרצאה הקודמת: וולידציה למספר מאפיינים יחד

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

  • טיפול בשגיאות בצד שרת - Exceptions
  • טיפול בערכי NULL
  • טיפול ב-CORS - קורס NodeJS
  • שלבי טיפול בפריצה

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

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