C # การจัดการข้อยกเว้น
ความผิดปกติในระหว่างการแก้ปัญหาการทำงานของโปรแกรม C # เป็นข้อยกเว้นในการตอบสนองต่อสถานการณ์พิเศษที่เกิดขึ้นเมื่อโปรแกรมทำงานเช่นความพยายามที่จะหารด้วยศูนย์
ยกเว้นมีให้โปรแกรมควบคุมจะถูกโอนจากส่วนหนึ่งเพื่อเป็นส่วนหนึ่งของวิธีการอื่น C #การจัดการข้อยกเว้นอยู่บนพื้นฐานของสี่คำสำคัญดังกล่าวข้างต้น:ลองจับในที่สุดและโยน
- ลอง: บล็อกลองระบุข้อยกเว้นเฉพาะของบล็อกของรหัสที่จะสามารถใช้งานได้ตามด้วยหนึ่งหรือมากกว่าจับบล็อก
- จับ: จับโปรแกรมยกเว้นผ่านการจัดการข้อยกเว้นจับคำหลักที่บ่งบอกถึงความผิดปกติของการจับภาพ
- ในที่สุด: สุดท้ายบล็อกจะใช้ในการดำเนินการคำสั่งที่กำหนดโดยไม่คำนึงว่ายกเว้นจะโยนจะดำเนินการตัวอย่างเช่นถ้าคุณเปิดแฟ้มโดยไม่คำนึงว่าควรจะมีไฟล์ยกเว้นจะปิด
- โยน: เมื่อมีปัญหาเกิดขึ้นโปรแกรมพ่นยกเว้นการใช้คำหลักที่จะเสร็จสมบูรณ์โยน
ไวยากรณ์
สมมติว่าบล็อกที่ผิดปกติวิธีการใช้คำหลักลองและจับข้อยกเว้น รหัสลอง / จับบล็อกมีการป้องกันรหัสใช้ลอง / จับดังแสดงในไวยากรณ์ต่อไปนี้:
ความพยายาม { } // คำชี้แจงที่ทำให้เกิดข้อยกเว้น catch (ExceptionName E1) { // การจัดการรหัสข้อผิดพลาด} catch (ExceptionName E2) { // การจัดการรหัสข้อผิดพลาด} catch (ExceptionName En) { // การจัดการรหัสข้อผิดพลาด} ในที่สุด { // งบในการดำเนินการ}
คุณสามารถแสดงรายการงบจับหลายที่จะจับความแตกต่างของข้อยกเว้นเพื่อป้องกันไม่ให้บล็อกลองสร้างข้อยกเว้นหลายภายใต้สถานการณ์ที่แตกต่างกัน
เรียนข้อยกเว้นใน C #
C # ข้อยกเว้นคือการใช้การแสดงชั้นเรียน เรียนข้อยกเว้นใน C # ส่วนใหญ่โดยตรงหรือโดยอ้อมมาจากชั้นSystem.ExceptionSystem.ApplicationException และSystem.SystemExceptionระดับได้มายกเว้นชั้นเรียน System.Exception
การสนับสนุนระดับSystem.ApplicationException สร้างขึ้นโดยข้อยกเว้นแอพลิเคชันดังนั้นข้อยกเว้นโปรแกรมเมอร์ที่กำหนดไว้ควรจะมาจากชั้นนี้
ระดับSystem.SystemException เป็นระบบที่กำหนดไว้ล่วงหน้าทุกชั้นฐานสำหรับข้อยกเว้น
ตารางต่อไปนี้บางรายการที่ได้รับจากการเรียนการยกเว้น Sytem.SystemException ระดับที่กำหนดไว้ล่วงหน้า:
异常类 | 描述 |
---|---|
System.IO.IOException | 处理 I/O 错误。 |
System.IndexOutOfRangeException | 处理当方法指向超出范围的数组索引时生成的错误。 |
System.ArrayTypeMismatchException | 处理当数组类型不匹配时生成的错误。 |
System.NullReferenceException | 处理当依从一个空对象时生成的错误。 |
System.DivideByZeroException | 处理当除以零时生成的错误。 |
System.InvalidCastException | 处理在类型转换期间生成的错误。 |
System.OutOfMemoryException | 处理空闲内存不足生成的错误。 |
System.StackOverflowException | 处理栈溢出生成的错误。 |
การจัดการข้อยกเว้น
C # และพยายามจับบล็อกที่ให้บริการในรูปแบบของโปรแกรมการจัดการโครงสร้างการยกเว้น การใช้บล็อกเหล่านี้งบโปรแกรมหลักและงบจัดการข้อผิดพลาดแยกออกจากกัน
จัดการบล็อกเหล่านี้ข้อผิดพลาดคือการใช้ลองจับและในที่สุดคำหลักที่จะประสบความสำเร็จนี่เป็นข้อยกเว้นโยนเมื่อหารด้วยศูนย์ตัวอย่าง:
การใช้ระบบ ErrorHandlingApplication namespace { DivNumbers ระดับ { ผล int; DivNumbers () { ผล = 0; } ส่วนโมฆะสาธารณะ (int num1, num2 int) { ความพยายาม { ผล = num1 / num2; } catch (DivideByZeroException จ) { Console.WriteLine ( "ข้อยกเว้นจับ: {0}", E); } ในที่สุด { Console.WriteLine ( "ผล: {0}" ผล); } } เป็นโมฆะคง main (String args []) { DivNumbers d = DivNumbers ใหม่ (); d.division (25, 0); Console.ReadKey (); } } }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
ยกเว้นจับ: System.DivideByZeroException: พยายามที่จะหารด้วยศูนย์ ที่ ... ผล: 0
สร้างข้อยกเว้นที่ผู้ใช้กำหนด
นอกจากนี้คุณยังสามารถกำหนดข้อยกเว้นของคุณเอง ระดับยกเว้นผู้ใช้กำหนดมาจากระดับApplicationExceptionตัวอย่างต่อไปนี้แสดงให้เห็นถึงจุดนี้:
การใช้ระบบ UserDefinedException namespace { TestTemperature ระดับ { เป็นโมฆะคง main (String args []) { อุณหภูมิอุณหภูมิ = อุณหภูมิใหม่ (); ความพยายาม { temp.showTemp (); } catch (TempIsZeroException จ) { Console.WriteLine ( "TempIsZeroException: {0}" e.Message); } Console.ReadKey (); } } } TempIsZeroException ระดับส่วนกลาง: ApplicationException { TempIsZeroException สาธารณะ (ข้อความ String): ฐาน (ข้อความ) { } } อุณหภูมิระดับประชาชน { อุณหภูมิ int = 0; โมฆะสาธารณะ showTemp () { ถ้า (อุณหภูมิ == 0) { โยน (TempIsZeroException ใหม่ ( "อุณหภูมิศูนย์พบ")); } อื่น { Console.WriteLine ( "อุณหภูมิ: {0}" อุณหภูมิ); } } }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
TempIsZeroException: อุณหภูมิศูนย์พบ
Throwable
หากยกเว้นจะโดยตรงหรือโดยอ้อมมาจากชั้นSystem.Exception คุณสามารถโยนวัตถุคุณสามารถใช้คำสั่งบล็อกจับโยนไปโยนวัตถุปัจจุบันดังนี้
catch (ยกเว้นจ) { ... โยน E }