תרגיל - התריעה וקליטת חריגות ביישום קונסולת C#
בתרגיל זה, trycatch תפתח בלוק קוד ופסוקית במשפטים ברמה העליונה, MakeChange תיצור ותתן חריגות בפעולת השירות ולאחר catch מכן תשלים את בלוק הקוד באמצעות אובייקט חריג. עליך להשלים את המשימות הבאות במהלך תרגיל זה:
- עדכן משפטים ברמה העליונה: יישם
try-catchתבנית במשפטים ברמה העליונה. בלוקtryהקוד יכיל את השיחה אלMakeChange. - שיטת
MakeChangeעדכון: צור והפנה חריגות עבור בעיות "אין מספיק עד" ו"תשלום תחתון". - עדכן את
catchבלוק הקוד כדי להשתמש במאפיינים של החריגה שזרקה. - בדיקת אימות: בצע בדיקות אימות עבור הקוד שפיתת בתרגיל זה.
try-catch הוספת תבנית במשפטים ברמה העליונה
במשימה זו, תחרף את השיחה MakeChange לשיטה בתוך משפט try ותיצור את הפסוקית המתאימה catch .
ודא שקובץ Program.cs פתוח בעורך הקוד של Visual Studio.
אתר את שורות הקוד הבאות:
// MakeChange manages the transaction and updates the till string transactionMessage = MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes); // Backup Calculation - each transaction adds current "itemCost" to the till if (transactionMessage == "transaction succeeded") { Console.WriteLine($"Transaction successfully completed."); registerCheckTillTotal += itemCost; } else { Console.WriteLine($"Transaction unsuccessful: {transactionMessage}"); }קח דקה כדי לשקול את מטרתו של קוד זה.
שים לב
MakeChangeשמחזיר ערך מחרוזת. ערך ההחזרה מוקצה למשתנה בשםtransactionMessage. אםtransactionMessageשווה ל- "transaction succeeded", העלות של הפריט שנרכש מתווספת ל-registerCheckTillTotal. המשתנה משמשregisterCheckTillTotalלאימות יתרת החוב שחושבה על-ידיMakeChangeהשיטה.כדי להקיף את השיחה לשיטה
MakeChangeבבלוק קודtryמשפט, עדכן את הקוד באופן הבא:try { // MakeChange manages the transaction and updates the till string transactionMessage = MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes); }הוסף את המשפט
catchהבא לאחר בלוקtryקוד המשפט:catch { }תסיים לפתח את הפסוקית
catchלאחר שתיווצר ותזרוק את החריגים.
יצירה והפעלה של חריגות בפעולת MakeChange השירות
במשימה זו, תעדכן כדי ליצור MakeChange ולתן חריגות מותאמות אישית כאשר לא ניתן להשלים טרנזקציה.
פעולת MakeChange השירות כוללת שתי בעיות שאמורות להוביל לחריגות:
בעיית תשלום תחתון: בעיה זו מתרחשת כאשר הלקוח מציע תשלום נמוך מהעלות של הפריט. אם הלקוח לא הציע מספיק תשלום, אמור
MakeChangeלהציג חריגה.אין מספיק בעיה עד: בעיה זו מתרחשת כאשר עד אינו מכיל את החשבונות הנדרשים כדי ליצור את השינוי המדויק. אם לא ניתן לבצע שינוי מדויק, צריך
MakeChangeלזרוק יוצא מן הכלל.
גלול מטה אל
MakeChangeהשירות.אתר את שורות הקוד הבאות:
if (changeNeeded < 0) transactionMessage = "Not enough money provided.";התחשב בבעיה שקוד זה ממוען בה.
אם
changeNeededהוא קטן מאפס, הלקוח לא סיפק מספיק כסף כדי לכסות את מחיר הרכישה של הפריט שהוא קונה. מחיר הרכישה והכסף שסופק על-ידי הלקוח הם פרמטרים שלMakeChangeהשיטה. לפעולת השירות אין אפשרות להשלים את העסקה כאשר הלקוח אינו מספק מספיק כסף. במילים אחרות, הפעולה נכשלת.קיימים שני סוגי חריגים המופיעים כך שמתאימים לתנאים אלה:
-
InvalidOperationException: ישInvalidOperationExceptionלציין חריגה רק כאשר תנאי ההפעלה של פעולת שירות אינם תומכים בהשלמה מוצלחת של קריאה לשיטה מסוימת. במקרה זה, תנאי ההפעלה נקבעים על-ידי הפרמטרים שסופקו לפעולת השירות. -
ArgumentOutOfRangeException- ישArgumentOutOfRangeExceptionלהתריעה על חריגה רק כאשר הערך של ארגומנט נמצא מחוץ לטווח הערכים המותר, כפי שהוגדר על-ידי פעולת השירות שהופעלה. במקרה זה הכסף שסופק חייב להיות גדול יותר מהעלות של הפריט.
כל אחד מסוגי החריגים יכול
InvalidOperationExceptionלפעול, אך הוא תואם בצורה טובה מעט בהקשר של יישום זה.-
עדכן את הקוד באופן הבא:
if (changeNeeded < 0) throw new InvalidOperationException("InvalidOperationException: Not enough money provided to complete the transaction.");גלול מטה כדי לאתר את שורות הקוד הבאות:
if (changeNeeded > 0) transactionMessage = "Can't make change. Do you have anything smaller?";התחשב בבעיה שקוד זה ממוען בה.
אם
changeNeededגדול מאפס לאחר הלולאותwhileשמכין את השינוי, אזי החשבונות של התוקף עד אז לא יהיו פועלים כדי לבצע שינויים. לשיטה אין אפשרות להשלים את הטרנזקציה כאשר לתשלומים אין את החשבונות הנדרשים כדי לבצע שינויים. במילים אחרות, הפעולה נכשלת.יש
InvalidOperationExceptionלהשתמש בחריגה כדי ליצור את החריגה.עדכן את הקוד באופן הבא:
if (changeNeeded > 0) throw new InvalidOperationException("InvalidOperationException: The till is unable to make the correct change.");
השלם את catch בלוק הקוד
במשימה זו, תעדכן את המשפט כדי catch לתפוס סוג חריגה ספציפי.
גלול למעלה מעל השיטה
MakeChangeואתר את הקוד הבא:catch { }כדי לתפוס את סוג החריגה שנזרקה בפעולת
MakeChangeהשירות, עדכן את הקוד באופן הבא:catch (InvalidOperationException e) { Console.WriteLine($"Could not complete transaction: {e.Message}"); }אובייקט
InvalidOperationExceptionהחריגה שנזרקה ייתפסMakeChange, אך סוגי חריגים אחרים לא ייתפסו. מאחר שאינך מוכן לטפל בסוגי חריגים אחרים, חשוב לתת להם להיתפס נמוך יותר במחסנית הקריאות. אם אתה מודע לכך שצפויים סוגי חריגים אחרים בתוךMakeChange, באפשרותך להוסיף משפטיםcatchנוספים.השתמש בתפריט קובץ כדי לשמור את העדכונים.
המר את פעולת השירות MakeChange מ- "string" ל"void" וממאפיינים של חריגת גישה
במשימה זו, תעדכן MakeChangevoidכדי להיות מסוג ולאחר מכן להשתמש במפרטי חריגה כדי להעביר פרטי בעיה למשתמש.
גלול לחלק העליון של
MakeChangeהשיטה.כדי להמיר את
MakeChangeפעולת השירות מסוג לסוגstring,voidעדכן את הקוד באופן הבא:static void MakeChange(int cost, int[] cashTill, int twenties, int tens = 0, int fives = 0, int ones = 0)מחק את הצהרת המשתנה הבאה:
string transactionMessage = "";גלול לחלק התחתון של השיטה
MakeChange.מחק את שורות הקוד הבאות:
if (transactionMessage == "") transactionMessage = "transaction succeeded"; return transactionMessage;גלול מעלה אל המשפטים ברמה העליונה ואתר את בלוק
tryהקוד.עדכן את
tryבלוק הקוד באופן הבא:try { // MakeChange manages the transaction and updates the till MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes); Console.WriteLine($"Transaction successfully completed."); registerCheckTillTotal += itemCost; }אתר ולאחר מכן מחק את שורות הקוד הבאות:
// Backup Calculation - each transaction adds current "itemCost" to the till if (transactionMessage == "transaction succeeded") { Console.WriteLine($"Transaction successfully completed."); registerCheckTillTotal += itemCost; } else { Console.WriteLine($"Transaction unsuccessful: {transactionMessage}"); }בלוקי
tryהקודcatchוהטרנזקציה מכריזים כעת על הודעות הטרנזקציה "הצלחה" ו"כישלון" למשתמש. מאחר שמאפיין החריגהMessageמתאר את הבעיה, משפט יחידConsole.WriteLine()מטפל בשתי הבעיות. לאחר עדכונים אלה, קל יותר לקרוא ולתחזק את הקוד שלך.השתמש בתפריט קובץ כדי לשמור את העדכונים.
בדוק את העבודה שלך
במשימה זו, תפעיל את היישום שלך ותאמת שהקוד המעודכן פועל כצפוי.
גלול מעלה כדי למצוא את
whileהלולאה במשפטים ברמה העליונה.לולאה זו משמשת לחזרה באמצעות הטרנזקציות.
אתר את הקוד הבא כמה שורות לפני תחילת הלולאה
while.int transactions = 10;עדכן את מספר הטרנזקציות כך
40:int transactions = 40;אתר את שורת הקוד הבאה בתוך הלולאה
while.int itemCost = valueGenerator.Next(2, 20);עדכן את
itemCostמחולל המספרים האקראיים באופן הבא:int itemCost = valueGenerator.Next(2, 50);טווח עלות זה הוא התאמה טובה יותר עבור פריטים שהלקוחות רוכשים.
השתמש בתפריט קובץ כדי לשמור את העדכונים.
בתפריט הפעלה , בחר התחל איתור באגים.
סקור את הפלט בלוח המסוף.
ודא שההודעות המשויכות לשני סוגי החריגים מוצגות:
דוח הטרנזקציות שלך אמור לכלול את ההודעות הבאות של "לא היתה אפשרות להשלים טרנזקציה":
Customer is making a $42 purchase Using 2 twenty dollar bills Using 0 ten dollar bills Using 0 five dollar bills Using 0 one dollar bills Could not complete transaction: InvalidOperationException: Not enough money provided to complete the transaction.Customer is making a $23 purchase Using 2 twenty dollar bills Using 0 ten dollar bills Using 0 five dollar bills Using 1 one dollar bills Cashier prepares the following change: A five A five A one A one Could not complete transaction: InvalidOperationException: The till is unable to make change for the cash provided.
מזל טוב, נותקת את יישום רישום המזומנים כדי לפתור בעיה של לוגיקת קוד, ו עדכנת את היישום כך שישתמש בטכניקות ראויות לטיפול בחריגות.
הערה
הפלט שדווח מראה שהכסף עד אינו מאוזן עוד. ישנם באגים לוגיים נוספים בקוד. מודול פרוייקט אתגר זמין אם אתה מעוניין להפגין את כישורי איתור הבאגים של קוד Visual Studio!