แบบฝึกหัด - โยนและตรวจจับข้อยกเว้นในแอปพลิเคชันคอนโซล C#
ในแบบฝึกหัดนี้ คุณจะพัฒนา try บล็อกโค้ดและ catch ส่วนคําสั่งในคําสั่งระดับบนสุด สร้างและแสดงข้อยกเว้นใน MakeChange เมธอด และดําเนินการบล็อกโค้ดให้เสร็จสมบูรณ์ catch โดยใช้ออบเจ็กต์ข้อยกเว้น คุณทำงานต่อไปนี้ให้เสร็จสมบูรณ์ระหว่างทำแบบฝึกหัดนี้:
- อัปเดตคําสั่งระดับบนสุด: ใช้
try-catchรูปแบบในคําสั่งระดับบนสุด บล็อกtryรหัสจะประกอบด้วยการเรียก ไปยังMakeChange - วิธีการอัปเดต
MakeChange: สร้างและโยนข้อยกเว้นสําหรับปัญหา "ไม่เพียงพอจนถึง" และ "การจ่ายเงินน้อยไป" -
catchอัปเดตบล็อกรหัสเพื่อใช้คุณสมบัติของข้อยกเว้นที่ถูกโยน - การทดสอบการตรวจสอบ: ทําการทดสอบการตรวจสอบสําหรับโค้ดที่คุณพัฒนาในแบบฝึกหัดนี้
try-catchเพิ่มรูปแบบไปยังคําสั่งระดับบนสุด
ในงานนี้ คุณจะใส่การเรียกไปยังMakeChangeเมธอด ภายในtryคําสั่ง และสร้างส่วนคําสั่งที่สอดคล้องกันcatch
ตรวจสอบให้แน่ใจว่าไฟล์ Program.cs เปิดอยู่ใน Visual Studio Code Editor
ค้นหาบรรทัดโค้ดต่อไปนี้:
// 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เท่ากับ "ธุรกรรมสําเร็จแล้ว" ระบบจะเพิ่มต้นทุนของสินค้าที่ซื้อไปยัง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 จาก "สตริง" เป็น "void" และเข้าถึงคุณสมบัติข้อยกเว้น
สําหรับงานนี้ คุณจะต้องอัปเดต MakeChange เป็นชนิด voidแล้วใช้คุณสมบัติข้อยกเว้นในการสื่อสารรายละเอียดปัญหากับผู้ใช้
เลื่อนไปที่ด้านบนของ
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 ของคุณ!