แบบฝึกหัด - ใช้การจัดการข้อยกเว้นการลองตรวจจับ

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

รูปแบบ try-catch ประกอบด้วย try บล็อกที่ตามด้วยส่วนคําสั่งอย่างน้อยหนึ่ง catch รายการ แต่ละ catch ส่วนคําสั่งระบุตัวจัดการสําหรับชนิดข้อยกเว้นที่แตกต่างกัน

เมื่อข้อยกเว้นจะเกิดขึ้น รันไทม์ภาษาทั่วไป (CLR) จะค้นหา catch ส่วนคําสั่งที่สามารถจัดการข้อยกเว้นได้ หากวิธีการ catch ที่กําลังดําเนินการไม่มีคําสั่งย่อยที่สามารถจัดการชนิดข้อยกเว้นโยน CLR จะค้นหาเมธอด ที่เรียกใช้เมธอด ปัจจุบัน การค้นหาจะดําเนินการต่อผ่านสแตกการโทรจนกว่าจะพบส่วนคําสั่งที่เหมาะสมcatch หากไม่พบ catch ส่วนคําสั่งในการจัดการข้อยกเว้น CLR จะแสดงข้อความข้อยกเว้นที่ไม่สามารถจัดการได้ให้กับผู้ใช้และหยุดการทํางานของโปรแกรม

ในแบบฝึกหัดนี้ คุณจะใช้รูปแบบพื้นฐานtry-catch

สร้างโครงการรหัสใหม่

ขั้นตอนแรกของคุณคือการสร้างโครงการรหัสที่คุณใช้ในระหว่างโมดูลนี้

  1. เปิดอินสแตนซ์ใหม่ของ Visual Studio Code

  2. บนเมนู ไฟล์ เลือก เปิดโฟลเดอร์

  3. ในกล่องโต้ตอบ เปิดโฟลเดอร์ ให้นําทางไปยังโฟลเดอร์ Windows Desktop ของคุณ

  4. บนกล่องโต้ตอบ เปิดโฟลเดอร์ เลือก โฟลเดอร์ใหม่

  5. ตั้งชื่อโฟลเดอร์ใหม่ Exceptions101 จากนั้นเลือกเลือกโฟลเดอร์

  6. บนเมนู เทอร์มินัล ให้เลือก เทอร์มินัลใหม่

    คุณจะใช้คําสั่ง .NET CLI เพื่อสร้างแอปคอนโซลใหม่

  7. ที่พรอมต์คําสั่งของแผงเทอร์มินัล ให้ป้อนคําสั่งต่อไปนี้:

    dotnet new console
    
  8. ปิดแผงขั้วต่อ

ใช้การทดลองใช้อย่างง่าย

  1. ใช้มุมมอง Visual Studio Code EXPLORER เพื่อเปิดไฟล์ Program.cs

  2. บนเมนู มุมมอง ให้เลือก ชุดคําสั่ง

  3. ที่พรอมต์คําสั่ง ให้ป้อน .net: g จากนั้นเลือก .NET: สร้าง Assets สําหรับการสร้างและดีบัก

  4. แทนที่เนื้อหาของไฟล์ Program.cs ด้วยโค้ดต่อไปนี้:

    double float1 = 3000.0;
    double float2 = 0.0;
    int number1 = 3000;
    int number2 = 0;
    
    Console.WriteLine(float1 / float2);
    Console.WriteLine(number1 / number2);
    Console.WriteLine("Exit program");
    
  5. ใช้เวลาสักครู่ในการตรวจสอบรหัส

    โปรดสังเกตว่าแอปพลิเคชันใช้ตัวแปรตัวเลขสองชนิด และ doubleint โค้ดจะทําการคํานวณการหารโดยใช้ชนิดตัวเลขทั้งสองชนิด

    นักพัฒนาใช้ double ตัวแปรชนิดสําหรับการคํานวณเมื่อค่าเศษส่วนที่แม่นยํามีความสําคัญ

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

    โปรดสังเกตว่า DivideByZeroException มีข้อยกเว้นเกิดขึ้นเมื่อหารค่าจํานวนเต็ม

    หมายเหตุ

    คุณอาจสังเกตเห็นว่าสมการที่ใช้ตัวแปรชนิด double สามารถทําให้เสร็จสมบูรณ์ได้โดยไม่ทําให้เกิดข้อผิดพลาด การคํานวณการหารด้วยศูนย์โดยใช้ double ตัวแปรชนิด จะแสดงผลลัพธ์เท่ากับค่าอินฟินิตี้ -infinity หรือ "ไม่ใช่ตัวเลข" ซึ่งไม่ได้หมายความว่าคุณควรใช้ double ตัวแปรชนิดแทน int หรือ decimal ชนิดเสมอไป วิธีการที่ถูกต้องคือการใช้ตัวแปรประเภทที่เหมาะสมและใช้การจัดการข้อยกเว้นเพื่อตรวจจับข้อผิดพลาดที่อาจเกิดขึ้น

  7. บนแถบเครื่องมือแก้จุดบกพร่อง เลือกดําเนินการต่อ

    สกรีนช็อตที่แสดงปุ่มดําเนินการต่อบนแถบเครื่องมือแก้จุดบกพร่อง

  8. ใช้เวลาสักครู่ในการตรวจสอบเอาต์พุตข้อความสําหรับแอปพลิเคชันของคุณ

    ∞
    Unhandled exception. System.DivideByZeroException: Attempted to divide by zero.
       at Program.<Main>$(String[] args) in C:\Users\msuser\Desktop\Exceptions101\Program.cs:line 7
    

    โปรดสังเกตว่าข้อยกเว้นที่ไม่ได้จัดการได้ทําให้แอปพลิเคชันของคุณปิดลงหลังจากคําสั่งแรก Console.WriteLine() เสร็จสมบูรณ์แล้ว

    หมายเหตุ

    ตามค่าเริ่มต้น Visual Studio Code จะใช้ข้อความสีที่แตกต่างกันเพื่อแสดงข้อความที่สร้างขึ้นโดยตัวดีบัก ซึ่งช่วยให้นักพัฒนาแยกความแตกต่างระหว่างเอาต์พุตของแอปพลิเคชันและข้อความตัวดีบัก หากคุณต้องการมุมมองเอาต์พุตของแอปพลิเคชันที่สะอาดยิ่งขึ้น คุณสามารถกําหนดค่าไฟล์ launch.json เพื่อใช้คอนโซลอื่นได้ ตัวอย่างเช่น ตั้งค่า console เพื่อใช้ integratedTerminal แผงเทอร์มินัลสําหรับเอาต์พุตของแอปพลิเคชัน ข้อความดีบักจะแสดงในแผงคอนโซลดีบักเสมอ

  9. ล้อมรอบการคํานวณสองรายการภายในบล็อกโค้ดของ try คําสั่งดังนี้:

    double float1 = 3000.0;
    double float2 = 0.0;
    int number1 = 3000;
    int number2 = 0;
    
    try
    {
        Console.WriteLine(float1 / float2);
        Console.WriteLine(number1 / number2);
    }
    
    Console.WriteLine("Exit program");
    
  10. สังเกตเส้นหยักสีแดงใต้วงเล็บปิดของ try บล็อก

    ไวยากรณ์ C# จําเป็นต้องมี catch หนึ่งหรือ finally หลายคําสั่งเมื่อคุณใช้ try คําสั่ง

  11. สร้างบล็อก catch รหัสด้านล่าง try บล็อกโค้ดดังนี้:

    try
    {
        Console.WriteLine(float1 / float2);
        Console.WriteLine(number1 / number2);
    }
    catch
    {
        Console.WriteLine("An exception has been caught");
    }
    
  12. บนเมนู ไฟล์ของ Visual Studio Code เลือก บันทึก

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

  14. ใช้เวลาสักครู่ในการตรวจสอบเอาต์พุตที่แอปพลิเคชันของคุณสร้างขึ้น

    ∞
    An exception has been caught
    Exit program
    
  15. โปรดสังเกตว่า แม้ว่าข้อยกเว้นจะยังคงเกิดขึ้นอยู่ แต่ในตอนนี้ แอปพลิเคชันของคุณสามารถดําเนินการบรรทัดโค้ดที่เหลือให้เสร็จสิ้นก่อนปิด

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

ตรวจพบข้อยกเว้นโยนในวิธีการที่เรียกว่า

ในหลายกรณี ข้อยกเว้นถูกจับได้ในระดับของสแตกการโทรที่อยู่ต่ํากว่าระดับที่โยน

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

  1. แทนที่โค้ดในไฟล์ Program.cs ของคุณด้วยโค้ดต่อไปนี้:

    try
    {
        Process1();
    }
    catch
    {
        Console.WriteLine("An exception has occurred");
    }
    
    Console.WriteLine("Exit program");
    
    static void Process1()
    {
        WriteMessage();
    }
    
    static void WriteMessage()
    {
        double float1 = 3000.0;
        double float2 = 0.0;
        int number1 = 3000;
        int number2 = 0;
    
        Console.WriteLine(float1 / float2);
        Console.WriteLine(number1 / number2);
    }
    
  2. ใช้เวลาสักครู่เพื่อตรวจสอบรหัสที่อัปเดตแล้ว

    • คําสั่งระดับบนสุดรวมถึง try บล็อกโค้ดที่เรียกใช้ Process1() วิธีการ
    • เม Process1() ธอด เรียกใช้ WriteMessage() เมธอด
    • เม WriteMessage() ธอด ประกอบด้วยรหัสที่ DivideByZeroException ข้อยกเว้นจะถูกโยน

    โปรดสังเกตว่าข้อยกเว้นจะถูกสร้างขึ้นในเมธอด ที่มีระดับสแตกการโทรสองระดับเหนือ try บล็อก และ catch โค้ด

    สกรีนช็อตที่แสดงระดับกองซ้อนการโทรระหว่างที่ข้อยกเว้นถูกโยนและตําแหน่งที่ถูกจับ

    คําสั่งระดับบนสุดจะแสดงเป็นเมธอด ที่ Main ชื่อในสแตกการเรียก

  3. บนเมนู ไฟล์ของ Visual Studio Code เลือก บันทึก

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

  5. ใช้เวลาสักครู่ในการตรวจสอบเอาต์พุตที่แอปพลิเคชันของคุณสร้างขึ้น

    ∞
    An exception has occurred
    Exit program
    
  6. โปรดสังเกตว่า แม้ว่าข้อยกเว้นจะถูกโยนสองระดับในสแตกการโทร แต่ก็ยังคงจัดการได้สําเร็จ

สรุป

นี่คือสิ่งสําคัญบางอย่างที่ต้องจําจากหน่วยนี้:

  • try-catchใช้รูปแบบกับtryบรรทัดโค้ดที่ระบุภายในแอปพลิเคชันcatchของคุณและข้อยกเว้นที่เกิดขึ้นภายในขอบเขตของtryบล็อกโค้ด
  • catchใช้คําสั่งย่อยเพื่อตรวจจับข้อยกเว้นโยนที่ระดับเดียวกันของสแตกการโทร
  • catchใช้คําสั่งย่อยเพื่อตรวจจับข้อยกเว้นโยนในระดับที่สูงกว่าของสแตกการโทร