แบบฝึกหัด - โยนและตรวจจับข้อยกเว้นในแอปพลิเคชันคอนโซล C#

เสร็จสมบูรณ์เมื่อ

ในแบบฝึกหัดนี้ คุณจะพัฒนา try บล็อกโค้ดและ catch ส่วนคําสั่งในคําสั่งระดับบนสุด สร้างและแสดงข้อยกเว้นใน MakeChange เมธอด และดําเนินการบล็อกโค้ดให้เสร็จสมบูรณ์ catch โดยใช้ออบเจ็กต์ข้อยกเว้น คุณทำงานต่อไปนี้ให้เสร็จสมบูรณ์ระหว่างทำแบบฝึกหัดนี้:

  1. อัปเดตคําสั่งระดับบนสุด: ใช้ try-catch รูปแบบในคําสั่งระดับบนสุด บล็อกtryรหัสจะประกอบด้วยการเรียก ไปยังMakeChange
  2. วิธีการอัปเดต MakeChange : สร้างและโยนข้อยกเว้นสําหรับปัญหา "ไม่เพียงพอจนถึง" และ "การจ่ายเงินน้อยไป"
  3. catchอัปเดตบล็อกรหัสเพื่อใช้คุณสมบัติของข้อยกเว้นที่ถูกโยน
  4. การทดสอบการตรวจสอบ: ทําการทดสอบการตรวจสอบสําหรับโค้ดที่คุณพัฒนาในแบบฝึกหัดนี้

try-catchเพิ่มรูปแบบไปยังคําสั่งระดับบนสุด

ในงานนี้ คุณจะใส่การเรียกไปยังMakeChangeเมธอด ภายในtryคําสั่ง และสร้างส่วนคําสั่งที่สอดคล้องกันcatch

  1. ตรวจสอบให้แน่ใจว่าไฟล์ Program.cs เปิดอยู่ใน Visual Studio Code Editor

  2. ค้นหาบรรทัดโค้ดต่อไปนี้:

    // 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}");
    }
    
  3. ใช้เวลาสักครู่ในการพิจารณาวัตถุประสงค์ของโค้ดนี้

    MakeChangeโปรดสังเกตว่า ส่งกลับค่าสตริง ค่าที่ส่งกลับจะถูกกําหนดให้กับตัวแปรที่ชื่อว่าtransactionMessage ถ้าtransactionMessageเท่ากับ "ธุรกรรมสําเร็จแล้ว" ระบบจะเพิ่มต้นทุนของสินค้าที่ซื้อไปยังregisterCheckTillTotal ตัวแปร registerCheckTillTotal ถูกใช้เพื่อตรวจสอบยอดดุลจนถึงที่คํานวณโดย MakeChange วิธีการ

  4. เมื่อต้องการใส่การเรียกไปยัง MakeChange เมธอด ใน try บล็อกโค้ดคําสั่ง ให้อัปเดตโค้ดของคุณดังต่อไปนี้:

    try
    {
        // MakeChange manages the transaction and updates the till 
        string transactionMessage = MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes);
    }
    
  5. เพิ่มส่วนคําสั่งต่อไปนี้ catch หลังจาก try บล็อกโค้ดคําสั่ง:

    catch
    {
    }
    

    คุณจะเสร็จสิ้นการพัฒนา catch ส่วนคําสั่งเมื่อคุณสร้างและโยนข้อยกเว้น

สร้างและแสดงข้อยกเว้นใน MakeChange วิธีการ

ในงานนี้ คุณจะอัปเดต MakeChange เพื่อสร้างและโยนข้อยกเว้นแบบกําหนดเองเมื่อไม่สามารถทําธุรกรรมให้เสร็จสมบูรณ์ได้

เม MakeChange ธอด ประกอบด้วยสองปัญหาที่ควรทําให้เกิดข้อยกเว้น:

  • ปัญหาการชําระเงินล่วงหน้า: ปัญหานี้เกิดขึ้นเมื่อลูกค้าเสนอการชําระเงินที่น้อยกว่าต้นทุนสินค้า หากลูกค้าไม่มีการชําระเงิน MakeChange เพียงพอควรมีข้อยกเว้น

  • ปัญหาจนถึงยังไม่เพียงพอ: ปัญหานี้จะเกิดขึ้นเมื่อไม่มีใบเรียกเก็บเงินที่จําเป็นในการสร้างการเปลี่ยนแปลงที่แน่นอน ถ้าจนถึงไม่สามารถทําการเปลี่ยนแปลง MakeChange ที่แน่นอนควรโยนและข้อยกเว้น

  1. เลื่อนลงไปที่วิธี MakeChange

  2. ค้นหาบรรทัดโค้ดต่อไปนี้:

    if (changeNeeded < 0)
        transactionMessage = "Not enough money provided.";
    
  3. ใช้เวลาสักครู่เพื่อพิจารณาปัญหาที่รหัสนี้ได้รับการแก้ไข

    หาก changeNeeded น้อยกว่าศูนย์ลูกค้าไม่มีเงินเพียงพอที่จะครอบคลุมราคาซื้อของรายการที่พวกเขาซื้อ ราคาซื้อและเงินที่ลูกค้ามอบให้คือพารามิเตอร์ของ MakeChange วิธีการ วิธีนี้ไม่สามารถทําธุรกรรมให้เสร็จสมบูรณ์ได้เมื่อลูกค้าไม่ให้เงินเพียงพอ กล่าวอีกนัยหนึ่งการดําเนินการล้มเหลว

    มีข้อยกเว้นสองชนิดที่ตรงกับเงื่อนไขเหล่านี้:

    • InvalidOperationException: ควรมี InvalidOperationException ข้อยกเว้นเฉพาะเมื่อเงื่อนไขการใช้งานของเมธอดไม่สนับสนุนการเสร็จสิ้นของการเรียกเมธอดเฉพาะที่เสร็จสมบูรณ์ ในกรณีนี้ เงื่อนไขในการใช้งานจะถูกสร้างขึ้นโดยพารามิเตอร์ที่จัดหาให้กับวิธีการ
    • ArgumentOutOfRangeException - ควรแสดง ArgumentOutOfRangeException ข้อยกเว้นเฉพาะเมื่อค่าของอาร์กิวเมนต์อยู่นอกช่วงค่าที่สามารถอนุญาตได้ตามที่กําหนดโดยวิธีการเรียกใช้ ในกรณีนี้เงินที่ระบุต้องมากกว่าต้นทุนของสินค้า

    ชนิดของข้อยกเว้นอาจทํางานได้ แต่ InvalidOperationException จะตรงกันเล็กน้อยในบริบทของแอปพลิเคชันนี้

  4. อัปเดตโค้ดดังต่อไปนี้:

    if (changeNeeded < 0)
        throw new InvalidOperationException("InvalidOperationException: Not enough money provided to complete the transaction.");
    
  5. เลื่อนลงเพื่อค้นหาบรรทัดโค้ดต่อไปนี้:

    if (changeNeeded > 0)
        transactionMessage = "Can't make change. Do you have anything smaller?";
    
  6. ใช้เวลาสักครู่เพื่อพิจารณาปัญหาที่รหัสนี้ได้รับการแก้ไข

    ถ้า changeNeeded มีค่ามากกว่าศูนย์หลังจาก while รอบที่เตรียมการเปลี่ยนแปลง จากนั้นใบเรียกเก็บเงินจะหมดแล้วที่สามารถใช้เพื่อทําการเปลี่ยนแปลงได้ วิธีการ ไม่สามารถทําธุรกรรมให้เสร็จสมบูรณ์ได้เมื่อไม่มีใบเรียกเก็บเงินที่จําเป็นเพื่อทําการเปลี่ยนแปลง กล่าวอีกนัยหนึ่งการดําเนินการล้มเหลว

    InvalidOperationExceptionควรใช้ข้อยกเว้นในการสร้างข้อยกเว้น

  7. อัปเดตโค้ดดังต่อไปนี้:

    if (changeNeeded > 0)
        throw new InvalidOperationException("InvalidOperationException: The till is unable to make the correct change.");
    

ทําบล็อกรหัสให้เสร็จสมบูรณ์catch

ในงานนี้ คุณจะอัปเดตส่วน catch คําสั่งเพื่อจับชนิดข้อยกเว้นที่เฉพาะเจาะจง

  1. เลื่อนขึ้นเหนือ MakeChange วิธีการ และค้นหาโค้ดต่อไปนี้:

    catch
    {
    }    
    
  2. หากต้องการจับชนิดข้อยกเว้นโยนใน MakeChange วิธีการ ให้อัปเดตโค้ดดังนี้:

    catch (InvalidOperationException e)
    {
        Console.WriteLine($"Could not complete transaction: {e.Message}");
    }    
    

    วัตถุ InvalidOperationException ข้อยกเว้นที่ถูกโยน MakeChange จะถูกจับ แต่ชนิดข้อยกเว้นอื่น ๆ จะไม่สามารถทําได้ เนื่องจากคุณไม่ได้เตรียมพร้อมที่จะจัดการข้อยกเว้นประเภทอื่น ๆ สิ่งสําคัญคือต้องให้พวกมันถูกจับในสแต็คการโทรที่ต่ํากว่า หากคุณตระหนักว่าชนิดข้อยกเว้นอื่นคาดหวังไว้ภายใน MakeChangeคุณสามารถเพิ่มส่วนคําสั่งเพิ่มเติม catch ได้

  3. ใช้เมนู ไฟล์ เพื่อบันทึกการอัปเดตของคุณ

แปลงเมธอด MakeChange จาก "สตริง" เป็น "void" และเข้าถึงคุณสมบัติข้อยกเว้น

สําหรับงานนี้ คุณจะต้องอัปเดต MakeChange เป็นชนิด voidแล้วใช้คุณสมบัติข้อยกเว้นในการสื่อสารรายละเอียดปัญหากับผู้ใช้

  1. เลื่อนไปที่ด้านบนของ MakeChange วิธีการ

  2. เมื่อต้องการแปลง MakeChange วิธีการ จากชนิด string ไปเป็นชนิด voidให้อัปเดตโค้ดดังต่อไปนี้:

    static void MakeChange(int cost, int[] cashTill, int twenties, int tens = 0, int fives = 0, int ones = 0)
    
  3. ลบการประกาศตัวแปรต่อไปนี้:

    string transactionMessage = "";
    
  4. เลื่อนไปที่ด้านล่างของ MakeChange วิธีการ

  5. ลบบรรทัดโค้ดต่อไปนี้:

    if (transactionMessage == "")
        transactionMessage = "transaction succeeded";
    
    return transactionMessage;
    
  6. เลื่อนขึ้นไปยังคําสั่งระดับบนสุดและค้นหาบล็อก try รหัส

  7. อัปเดตโค้ด try บล็อกดังต่อไปนี้:

    try
    {
        // MakeChange manages the transaction and updates the till 
        MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes);
    
        Console.WriteLine($"Transaction successfully completed.");
        registerCheckTillTotal += itemCost;
    }
    
  8. ค้นหาและลบบรรทัดโค้ดต่อไปนี้:

    // 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() แก้ไขปัญหาทั้งสอง รหัสของคุณง่ายต่อการอ่านและรักษาไว้หลังจากการอัปเดตเหล่านี้

  9. ใช้เมนู ไฟล์ เพื่อบันทึกการอัปเดตของคุณ

ตรวจสอบงานของคุณ

สําหรับงานนี้ คุณจะเรียกใช้แอปพลิเคชันของคุณและตรวจสอบว่ารหัสที่อัปเดตแล้วของคุณทํางานตามที่คุณต้องการหรือไม่

  1. เลื่อนขึ้นเพื่อค้นหารอบ while ในคําสั่งระดับบนสุด

    รอบนี้ใช้เพื่อทําซ้ําผ่านทรานสคชัน

  2. ค้นหาโค้ดต่อไปนี้สองสามบรรทัดก่อนจุดเริ่มต้นของการ while วนรอบ

    int transactions = 10;
    
    
  3. อัพเดตจํานวนธุรกรรม 40 เป็น ดังนี้:

    int transactions = 40;
    
    
  4. ค้นหาบรรทัดโค้ดต่อไปนี้ภายในการ while วนรอบ

    int itemCost = valueGenerator.Next(2, 20);
    
    
  5. อัปเดตตัว itemCost สร้างตัวเลขแบบสุ่มดังนี้:

    int itemCost = valueGenerator.Next(2, 50);
    
    

    ช่วงต้นทุนนี้เป็นการจับคู่ที่ดีกว่าสําหรับสินค้าที่ลูกค้าจะจัดซื้อ

  6. ใช้เมนู ไฟล์ เพื่อบันทึกการอัปเดตของคุณ

  7. บนเมนูเรียกใช้ เลือกเริ่มการดีบัก

  8. ตรวจสอบเอาต์พุตในแผงเทอร์มินัล

  9. ตรวจสอบว่าข้อความที่เกี่ยวข้องกับชนิดข้อยกเว้นสองชนิดจะแสดงขึ้นมา:

    รายงานธุรกรรมของคุณควรมีข้อความ "ไม่สามารถทําธุรกรรมให้เสร็จสมบูรณ์" ดังต่อไปนี้ได้:

    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 ของคุณ!