แบบฝึกหัด - ใช้การจัดการข้อยกเว้นการลองตรวจจับ
รูปแบบ try-catch ประกอบด้วย try บล็อกที่ตามด้วยส่วนคําสั่งอย่างน้อยหนึ่ง catch รายการ แต่ละ catch ส่วนคําสั่งระบุตัวจัดการสําหรับชนิดข้อยกเว้นที่แตกต่างกัน
เมื่อข้อยกเว้นจะเกิดขึ้น รันไทม์ภาษาทั่วไป (CLR) จะค้นหา catch ส่วนคําสั่งที่สามารถจัดการข้อยกเว้นได้ หากวิธีการ catch ที่กําลังดําเนินการไม่มีคําสั่งย่อยที่สามารถจัดการชนิดข้อยกเว้นโยน CLR จะค้นหาเมธอด ที่เรียกใช้เมธอด ปัจจุบัน การค้นหาจะดําเนินการต่อผ่านสแตกการโทรจนกว่าจะพบส่วนคําสั่งที่เหมาะสมcatch หากไม่พบ catch ส่วนคําสั่งในการจัดการข้อยกเว้น CLR จะแสดงข้อความข้อยกเว้นที่ไม่สามารถจัดการได้ให้กับผู้ใช้และหยุดการทํางานของโปรแกรม
ในแบบฝึกหัดนี้ คุณจะใช้รูปแบบพื้นฐานtry-catch
สร้างโครงการรหัสใหม่
ขั้นตอนแรกของคุณคือการสร้างโครงการรหัสที่คุณใช้ในระหว่างโมดูลนี้
เปิดอินสแตนซ์ใหม่ของ Visual Studio Code
บนเมนู ไฟล์ เลือก เปิดโฟลเดอร์
ในกล่องโต้ตอบ เปิดโฟลเดอร์ ให้นําทางไปยังโฟลเดอร์ Windows Desktop ของคุณ
บนกล่องโต้ตอบ เปิดโฟลเดอร์ เลือก โฟลเดอร์ใหม่
ตั้งชื่อโฟลเดอร์ใหม่ Exceptions101 จากนั้นเลือกเลือกโฟลเดอร์
บนเมนู เทอร์มินัล ให้เลือก เทอร์มินัลใหม่
คุณจะใช้คําสั่ง .NET CLI เพื่อสร้างแอปคอนโซลใหม่
ที่พรอมต์คําสั่งของแผงเทอร์มินัล ให้ป้อนคําสั่งต่อไปนี้:
dotnet new consoleปิดแผงขั้วต่อ
ใช้การทดลองใช้อย่างง่าย
ใช้มุมมอง Visual Studio Code EXPLORER เพื่อเปิดไฟล์ Program.cs
บนเมนู มุมมอง ให้เลือก ชุดคําสั่ง
ที่พรอมต์คําสั่ง ให้ป้อน .net: g จากนั้นเลือก .NET: สร้าง Assets สําหรับการสร้างและดีบัก
แทนที่เนื้อหาของไฟล์ 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");ใช้เวลาสักครู่ในการตรวจสอบรหัส
โปรดสังเกตว่าแอปพลิเคชันใช้ตัวแปรตัวเลขสองชนิด และ
doubleintโค้ดจะทําการคํานวณการหารโดยใช้ชนิดตัวเลขทั้งสองชนิดนักพัฒนาใช้
doubleตัวแปรชนิดสําหรับการคํานวณเมื่อค่าเศษส่วนที่แม่นยํามีความสําคัญบนเมนูเรียกใช้ เลือกเริ่มการดีบัก
โปรดสังเกตว่า
DivideByZeroExceptionมีข้อยกเว้นเกิดขึ้นเมื่อหารค่าจํานวนเต็มหมายเหตุ
คุณอาจสังเกตเห็นว่าสมการที่ใช้ตัวแปรชนิด
doubleสามารถทําให้เสร็จสมบูรณ์ได้โดยไม่ทําให้เกิดข้อผิดพลาด การคํานวณการหารด้วยศูนย์โดยใช้doubleตัวแปรชนิด จะแสดงผลลัพธ์เท่ากับค่าอินฟินิตี้ -infinity หรือ "ไม่ใช่ตัวเลข" ซึ่งไม่ได้หมายความว่าคุณควรใช้doubleตัวแปรชนิดแทนintหรือdecimalชนิดเสมอไป วิธีการที่ถูกต้องคือการใช้ตัวแปรประเภทที่เหมาะสมและใช้การจัดการข้อยกเว้นเพื่อตรวจจับข้อผิดพลาดที่อาจเกิดขึ้นบนแถบเครื่องมือแก้จุดบกพร่อง เลือกดําเนินการต่อ
ใช้เวลาสักครู่ในการตรวจสอบเอาต์พุตข้อความสําหรับแอปพลิเคชันของคุณ
∞ 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แผงเทอร์มินัลสําหรับเอาต์พุตของแอปพลิเคชัน ข้อความดีบักจะแสดงในแผงคอนโซลดีบักเสมอล้อมรอบการคํานวณสองรายการภายในบล็อกโค้ดของ
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");สังเกตเส้นหยักสีแดงใต้วงเล็บปิดของ
tryบล็อกไวยากรณ์ C# จําเป็นต้องมี
catchหนึ่งหรือfinallyหลายคําสั่งเมื่อคุณใช้tryคําสั่งสร้างบล็อก
catchรหัสด้านล่างtryบล็อกโค้ดดังนี้:try { Console.WriteLine(float1 / float2); Console.WriteLine(number1 / number2); } catch { Console.WriteLine("An exception has been caught"); }บนเมนู ไฟล์ของ Visual Studio Code เลือก บันทึก
บนเมนูเรียกใช้ เลือกเริ่มการดีบัก
ใช้เวลาสักครู่ในการตรวจสอบเอาต์พุตที่แอปพลิเคชันของคุณสร้างขึ้น
∞ An exception has been caught Exit programโปรดสังเกตว่า แม้ว่าข้อยกเว้นจะยังคงเกิดขึ้นอยู่ แต่ในตอนนี้ แอปพลิเคชันของคุณสามารถดําเนินการบรรทัดโค้ดที่เหลือให้เสร็จสิ้นก่อนปิด
การจัดการข้อยกเว้นช่วยให้คุณสามารถควบคุมการดําเนินการโค้ดได้เมื่อมีการยกเว้นเกิดขึ้น การจัดการข้อยกเว้นช่วยให้มั่นใจได้ว่าโค้ดของคุณมีความเสถียรและให้ผลลัพธ์ที่คาดหวัง
ตรวจพบข้อยกเว้นโยนในวิธีการที่เรียกว่า
ในหลายกรณี ข้อยกเว้นถูกจับได้ในระดับของสแตกการโทรที่อยู่ต่ํากว่าระดับที่โยน
เมื่อพบข้อยกเว้นและวิธีการปัจจุบันไม่สามารถตรวจจับข้อยกเว้นได้ รันไทม์ภาษาทั่วไปจะคลายออกโดยมองหาวิธีการที่มี catch คําสั่งที่สามารถจัดการข้อยกเว้นได้ ส่วนคําสั่งแรก catch ที่พบซึ่งสามารถจัดการข้อยกเว้นจะดําเนินการได้ ถ้าไม่พบส่วนคําสั่งที่เหมาะสม catch ที่ใดก็ได้ในสแตกการเรียก รันไทม์ภาษาทั่วไปจะยุติกระบวนการ และแสดงข้อผิดพลาดให้ผู้ใช้
แทนที่โค้ดในไฟล์ 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); }ใช้เวลาสักครู่เพื่อตรวจสอบรหัสที่อัปเดตแล้ว
- คําสั่งระดับบนสุดรวมถึง
tryบล็อกโค้ดที่เรียกใช้Process1()วิธีการ - เม
Process1()ธอด เรียกใช้WriteMessage()เมธอด - เม
WriteMessage()ธอด ประกอบด้วยรหัสที่DivideByZeroExceptionข้อยกเว้นจะถูกโยน
โปรดสังเกตว่าข้อยกเว้นจะถูกสร้างขึ้นในเมธอด ที่มีระดับสแตกการโทรสองระดับเหนือ
tryบล็อก และcatchโค้ด
คําสั่งระดับบนสุดจะแสดงเป็นเมธอด ที่
Mainชื่อในสแตกการเรียก- คําสั่งระดับบนสุดรวมถึง
บนเมนู ไฟล์ของ Visual Studio Code เลือก บันทึก
บนเมนูเรียกใช้ เลือกเริ่มการดีบัก
ใช้เวลาสักครู่ในการตรวจสอบเอาต์พุตที่แอปพลิเคชันของคุณสร้างขึ้น
∞ An exception has occurred Exit programโปรดสังเกตว่า แม้ว่าข้อยกเว้นจะถูกโยนสองระดับในสแตกการโทร แต่ก็ยังคงจัดการได้สําเร็จ
สรุป
นี่คือสิ่งสําคัญบางอย่างที่ต้องจําจากหน่วยนี้:
-
try-catchใช้รูปแบบกับtryบรรทัดโค้ดที่ระบุภายในแอปพลิเคชันcatchของคุณและข้อยกเว้นที่เกิดขึ้นภายในขอบเขตของtryบล็อกโค้ด -
catchใช้คําสั่งย่อยเพื่อตรวจจับข้อยกเว้นโยนที่ระดับเดียวกันของสแตกการโทร -
catchใช้คําสั่งย่อยเพื่อตรวจจับข้อยกเว้นโยนในระดับที่สูงกว่าของสแตกการโทร