งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

Visual C# 2010 Express 7. Exception ให้เกิดความผิดพลาดน้อยที่สุด อย่างน้อยให้ โปรแกรมทำงานต่อไปได้ 1C# Programming with Visual C# 2010 Express.

งานนำเสนอที่คล้ายกัน


งานนำเสนอเรื่อง: "Visual C# 2010 Express 7. Exception ให้เกิดความผิดพลาดน้อยที่สุด อย่างน้อยให้ โปรแกรมทำงานต่อไปได้ 1C# Programming with Visual C# 2010 Express."— ใบสำเนางานนำเสนอ:

1 Visual C# 2010 Express 7. Exception ให้เกิดความผิดพลาดน้อยที่สุด อย่างน้อยให้ โปรแกรมทำงานต่อไปได้ 1C# Programming with Visual C# 2010 Express

2 เป้าหมายการเรียนรู้  เอ็กเซ็บชันคืออะไร  เอ็กเซ็บชันในดอตเน็ต  การจัดการกับเอ็กเซ็บชัน และบล็อก try … catch  บล็อก จัดการเอ็กเซ็บชัน ซ้อนกัน  พร็อบเพอร์ตี้ของเอ็กเซ็บชันทั่วไป  บล็อก finally  คำสั่ง checked/ unchecked กับเอ็กเซ็บชัน  การสร้างอ๊อปเจ็คเอ็กเซ็บชัน  การโยนความผิดไปยังเมทธอดที่เรียกใช้งาน 2C# Programming with Visual C# 2010 Express

3 ความหมายของเอ็กเซ็บชัน และเหตุผล  เอ็กเซ็บชัน มาจากศัพท์ว่า Exception แปลตามตัวว่า ได้รับ การยกเว้น ไม่เป็นไปตามกฏ ในทางคอมพิวเตอร์ก็ใช้ ในทางความหมายใกล้เคียงนี้ แต่เฉพาะที่ตรงความ ผิดพลาดของโปรแกรม เพราะเกิดอะไรก็ตามที่ไม่เป็นไป ตามเงื่อนไข หรือการไม่ทำงานตามที่คาดหวังไว้ ให้ยกเว้น ไว้  ความผิดพลาดมีมากมาย นักเขียนโปรแกรมในรุ่นแรก ใช้ ตรวจจับความผิดพลาด ด้วยการเขียนโปรแกรมในเงื่อนไข เช่น if หรือ switch ให้ทำงานในเงื่อนไข ต่างๆ แต่ในกรณี ที่นอกเหนือความคาดหวังในการทำงานผิดพลาดมากๆ โปรแกรมก็จะหยุดทำงาน เพราะไม่สามารถทำงานใน เงื่อนไขที่ตรวจสอบได้ จึงต้องมี Exception ให้ยกเว้นไว้ C# Programming with Visual C# 2010 Express3

4 เอ็กเซ็บชันในเมทธอด  ถ้า Method A( ) เรียกใช้ B( ) และ B( ) เรียกใช้ C( )  ถ้าเกิดความผิดพลาดในเมธอด C( ) เมธอด B( ) จะทำงาน ไม่ได้ และ A( ) ก็ทำงานไม่ได้  ถ้าเกิดความผิดพลาดในเมธอด B( ) เมธอด A( ) จะทำงาน ไม่ได้  A( ) เป็นเมธอดสุดท้าย ที่ควรจะต้องทำงานได้เสมอ เปรียบเสมือน ในโปรแกรมหลักต้องทำงานได้เสมอ  การเขียน เอ็กเซ็บชัน ในเมธอดสุดท้ายจึงต้องมีเสมอ เพื่อ โปรแกรมทำงานต่ไปได้  เมธอดสุดท้าย ใน C# คือ เมธอด main ( ) C# Programming with Visual C# 2010 Express4

5 เอ็กเซ็บชันในดอนเน็ต  คลาส Exception นี้ได้แยกประเภท เอ็กเซ็บชันได้เป็นคลาส สองประเภท คือ  SystemException เป็นคลาสที่นิยามความผิดพลาดของระบบ ความผิดพลาดที่เกิดขึ้นจะส่งโดย CLR ยกตัวอย่างเช่น StackOverflowException เป็นเหตุการณ์ที่ CLR ตรวจสอบ พบว่าสเตกล้น  ApplicationException เป็นเอ็กเซ็บชันที่นักพัฒนาแอปพลิเคชัน พัฒนาขึ้นใช้เอง(third parties) ถ้าต้องการที่สร้างเอ็กเซ็บชันให้ ครอบคลุมเงื่อนไขเฉพาะของตนเอง ควรใช้สืบทอดจากคลาสนี้ ได้ทั้งทางตรงและทางอ้อม C# Programming with Visual C# 2010 Express5

6 แผนภาพคลาส บางส่วนของ Exception C# Programming with Visual C# 2010 Express6

7 สำหรับเอ็บเซ็บชันที่ควรนำไปใช้บ่อยที่ควรรู้จัก  ArgumentException เกิดขึ้นเมื่อผู้เรียกเมธอดโดยตัวแปรเข้า ไม่ตรงกับ ที่ต้องการของเมธอดนั้น เช่น มีตัวแปรเข้าไม่ครบ หรือมีชนิดตัวแปรไม่ตรงกับที่ต้องการ  FormatException เกิดขึ้นเมื่อรูปแบบตัวแปรเข้าไม่ตรงกับ ความต้องการ เช่น เมื่อเรียกเมธอดโดยใช้ตัวเข้าเป็นอักษรที่ ไม่ใช่รูปแบบของวันที่ ( )  StackOverflowException เกิดขึ้นเมื่อหน่วยความจำเต็มในส แตก อย่างเช่นการเรียกฟังก์ชันรีเคอซีพ หรือเมธอดเรียก ตัวเอง และมักเป็นความผิดพลาดที่ทำให้โปรแกรมหยุดทำงาน  EndOfStreamException เกิดขึ้นเมื่อพยายามที่จะเรียกอ่าน ไฟล์ทั้งๆที่ อ่านไฟล์ไม่ได้แล้วเนื่องจากจบไฟล์แล้ว  OverflowException เกิดขึ้นเมื่อพยายามใช้คำสั่ง แปลงค่า (cast) ตัวเลข แล้วเลยค่าสุดท้าย C# Programming with Visual C# 2010 Express7

8 การใช้ Try... Catch  ในการเขียนโปรแกรมเชิงวัตถุได้ใช้โครงสร้างการ แก้ปัญหาการจัดการกับความผิดพลาดในรูปของบล็อก try… catch… แทนการจัดการความผิดพลาดแบบเดิม โดย แยกการทำงานของโปรแกรมตามปกติ ไว้ในบล็อก try และ ส่วนที่ดูแลความผิดพลาดอยู่ในบล็อก catch โดยที่เมื่อเกิด ความผิดพลาดในบล็อก try จะโยน (throw) ความผิดนั้นไป ในบล็อก catch ไวยกรณ์ของบล็อก เป็นดังนี้ C# Programming with Visual C# 2010 Express8 try { // … } catch ( class-type ) { // …. }

9 ตัวอย่างการจัดการความผิดพลาด 1. try 2. { 3. int x = 3; 4. int y = 0; 5. float ans; 6. ans = x / y; 7. } 8. catch (Exception e) 9. { 10. Console.WriteLine(e.Message); 11. } C# Programming with Visual C# 2010 Express9

10 ลำดับชั้นของบล็อก catch  ถ้าเกิดมีความผิด คนเมา ตกตึก ตาย อะไรคือสาเหตุที่ทำให้ เขาตาย ตกตึก หรือเมา แน่นอน เขาตายเพราะตกตึก และเขาตกตึก เพราะเมา  มันมีลำดับ ความผิดพลาดเช่น เดียวกับ คนเมา ตกตึก และ ตาย ถ้าเขาไม่เมา เขา อาจไม่ ตกตึก (แปลว่าบางที่เมาไม่ ต้องตายก็ได้ )  การจัดการกับความผิดพลาด อาจป้องกัน ในหลายระดับ ทั้ง ระดับ ตกตึก และระดับเมา แต่อันใด จะป้องกันก่อนกัน  โดยทั่วไป การจัดการความผิดพลาด เริ่มจากความผิดพลาด ที่เฉพาะไปสู่ความผิดพลาดทั่วไป (ทำไมเป็นแบบนี้ ) C# Programming with Visual C# 2010 Express10

11 ลำดับของเอ็กเซ็บชัน C# Programming with Visual C# 2010 Express11 การใช้การจับความผิดพลาดของเอ็กเซ็บชันจะต้องเรียง จากลำดับ แคบน้อยไปมาก เป็นกฏ หากไม่เป็นตามกฏจะไม่สามารถคอมไฟล์ ได้

12 การจัดการลำดับการความผิดพลาดที่ผิดลำดับ 1. try { 2. int x = 3; 3. int y = 0; 4. float ans; 5. ans = x / y; 6. } 7. catch (Exception e) //*****Error***** { 8. Console.WriteLine(e.Message); 9. } 10. catch (OverflowException over){ 11. Console.WriteLine(over.Message); 12. } C# Programming with Visual C# 2010 Express12

13 การใช้ try ซ้อน try  การทำบล็อก try ซ้อนกัน หรือทำเน็สติ้ง (nesting) ของ บล็อก try ก็เหมือนกับการเขียนสเตทเม้นท์ทั่วไปของ C#  การทำเน็ตติ้งนี้มีจะช่วยการจัดการความผิดพลาดใน ระดับโลคอล (local) ที่ต้องการแยกย่อยจัดการความ ผิดพลาด ได้ความเอ็กเซ็บชันที่ไม่สามารถใช้ลำดับชั้นของ เอ็กเซ็บชันได้  ตัวอย่าง เช่น จะมีการทดสอบความผิดพลาดของเอ็กเซ็บชัน ของไฟล์ด้วย FileNotFoundException ก่อน หากไม่มี ความผิดพลาดใดๆ ของการทำงานกับไฟล์ ก็จะเป็นทดสอบ เอ็กเซ็บชันของ ลำดับเอ็กเซ็บชันบล็อกนอกต่อไป C# Programming with Visual C# 2010 Express13

14 พร็อบเพอร์ตี้ของเอ็กเซ็บชัน C# Programming with Visual C# 2010 Express14 พร็อบเพอร์ตี้คำอธิบาย Message เป็นคำอธิบายความผิดพลาดที่เกิดขึ้น Source เป็นชื่ออ๊อปเจ็คหรือแอปพลิเคชัน ที่ทำให้เกิดความ ผิดพลาด StackTrace เป็นชุดข้อความในจุดที่ทำให้เกิดความผิดพลาด TargetSite เป็นชื่อของเมธอดที่ทำให้เกิดเอ็กเซ็บชัน InnerExceptio n ใช้สำหรับเก็บเอ็กเซ็บชันย่อย เช่น เมื่อเกิดเอ็กเซ็บชัน ของ X โดยที่ X ยังมีค่าการเกิดเอ็กเซ็บชัน Y HelpLine เป็นการกำหนด หรือเรียกไฟล์ช่วยเหลือที่สัมพันธ์กับเอ็ก เซ็บชัน ให้อ่านเพิ่มเติม Data เป็นเรียกข้อมูลเพิ่มเติมเกี่ยวกับเอ็เซ็บชัน ที่ถูกกำหนด ขึ้นเองในรูปของค่าเป็นคู่ Key/Value

15 การใช้บล็อก finally กับเอ็กเซ็บชัน  บล็อกไฟนอลลี่ เป็นการรับประกันการทำงานเสมอ แม้จะมี เอ็กเซ็บชันหรือไม่ก็ตาม  ไฟนอลลี่บล็อก มักใช้กับการคืนทรัพยากรที่ระบบได้ใช้ เสร็จแล้ว แม้มีความผิดพลาด หรือไม่มีความผิดพลาด จะคืน ค่าทรัพยากรณีให้มีค่าดังเดิม หรือ ที่เรียกส่วนนี้ว่า Unmanaged ที่นอกเหนือ ที่ C# จะทำงานได้ เช่น ส่วน ระบบอื่นๆ ไม่ว่าจะเป็น ระบบฐานข้อมูล ระบบปฏิบัติการ ระบบเครื่อข่าย  ตัวอย่างเช่น การเปิดการต่อเชื่อมกับระบบฐานข้อมูล เมื่อใช้ งานเสร็จ ไม่ว่าจะทำงานกับฐานข้อมูลได้ผล หรือไม่ได้ผลก็ ตาม C# Programming with Visual C# 2010 Express15

16 โครงสร้างของ try… catch... finally try 2. { 3. // Statement in Try block. 4. } 5. catch ([catch specification]) 6. { 7. // Statement in Catch block. 8. } 9. finally 10. { 11. // Statement in Finally block. 12. } C# Programming with Visual C# 2010 Express16

17 ลำดับการทำงานของบล็อก try catch finally …  ไม่มีความผิดพลาดใดๆ  ทำงานต่อที่บล็อก finally เป็นลำดับสุดท้าย (ข้ามบล็อก catch ไป)  มีความผิดพลาด  จับความผิดพลาดได้  ทำงานที่บล็อก catch  ทำงานต่อไปที่ บล็อก finally  จับความผิดพลาดไม่ได้ ขึ้นอยู่กับเมธอดที่เรียกใช้งาน หากเมธ อดที่เรียกทำงานมีไม่มีเอ็กเซ็บชันรองรับโปรแกรมจะหยุด ทำงาน และบล็อก finally จะไม่ทำงาน ดังนั้นแล้วควรที่จะให้ เอ็กเซ็บชันทั่วไป เป็นลำดับสุดท้าย ของบล็อก catch เพื่อให้ จับความผิดพลาดได้ และให้บล็อก finally ทำงานได้ C# Programming with Visual C# 2010 Express17

18 ตัวอย่างต่อไปนี้เป็นการใช้ try … catch… finally 1. String cnString = "xyz"; 2. System.Data.SqlClient.SqlConnection cn = 3. new System.Data.SqlClient.SqlConnection(); 4. try { 5. cn.ConnectionString = cnString; //error 6. cn.Open(); 7. } 8. catch (Exception e) { 9. Console.WriteLine(e.Message); 10. } 11. finally { 12. cn.Close(); 13. cn.Dispose(); 14. } C# Programming with Visual C# 2010 Express18

19 การใช้คีย์เวิร์ด Checked, Unchecked  การทำให้ซีชาร์ปเกิดเอ็กเซ็บชัน หรือตรวจสอบการเก็บเกิด ขนาดจะต้องใช้คีย์เวิร์ด Checked (และไม่ต้องตรวจสอบ ใช้คีย์เวิริ์ด Unchecked)  หรือกำหนดใน Project Property ใน Build Tab คลิกเลือก ปุ่มคำสั่ง Advanced อยู่ด้านขวาล่าง จะเกิดหน้าต่าง Advanced Build Setting แล้วคลิกเลือก Check for arithmetic overflow/underflow C# Programming with Visual C# 2010 Express19

20 ตัวอย่าการใช้ checked 1. static void Main(string[] args){ 2. try { 3. Console.WriteLine(Multiply(2, 32767)); 4. } 5. catch (OverflowException e) { 6. Console.WriteLine(e.Message); 7. } 8. catch (Exception e) { 9. Console.WriteLine(e.Message); 10. } 11. } 12. static short Multiply(short x, short y){ 13. return checked((short)(x * y)); 14. } C# Programming with Visual C# 2010 Express20

21 การสร้างอ๊อปเจ็คเอ็กเซ็บชัน  การสร้างอ๊อปเจ็คเอ็กเซ็บชันใหม่ เพื่อปรับแต่งการอธิบาย ความผิดพลาดให้ตรงกับที่ต้องการจริงๆ มากกว่าที่จะใช้ค่า ปริยายของเอ็กเซ็บชันของคลาสเดิม  การปรับแต่งให้ตรงกับความต้องการมักใช้ การเปลี่ยนการ อธิบายความผิดพลาด เช่น ในที่นี้จะใช้คำอธิบายเป็น ภาษาไทย เพื่ออธิบายความผิดพลาดจากเดิมใช้ค่าปริยาย ในรูปแบบภาษาอังกฤษ หรือเปลี่ยนคำอธิบายให้ตรงกับ ความผิดพลาดที่จะเกิดขึ้น C# Programming with Visual C# 2010 Express21 // ตัวอย่างที่ 1 // สร้างอ๊อปเจ็ค FormatException ที่มีข้อความอธิบายความผิดพลาด FormatException ex = new FormatException(" รูปแบบตัวแปรเข้าไม่ถูกต้อง ");...

22 คำสั่ง throw  เมื่อมีความผิดพลาดที่ตน แต่ไม่อยากรับผิดชอบ มีวิธีที่ดีกว่า ที่จะทำให้ตนเองไม่ต้องเสียหาย โดยโยนความผิดให้ คนอื่น รับผิดชอบแทนไป  ใน c# ใช้คีย์เวิร์ด throw โยนไปเลย ไปยังเมธอดอื่น ถ้าเมธ อดที่รับความผิดพลาด ไม่มีการการจัดการความผิดพลาดละ จะเกิดอะไรขึ้น คำตอบ ก็เป็นเรื่องของ(เมธอด)คุณ  แต่โดยธรรมชาติ แล้วโปรแกรมเมอร์ จะไม่ทำอย่างนั้น อย่างนั้นก็ต้องให้เมธอดที่รับไป ต้องมีการจัดการกับความ ผิดพลาดนั้นบ้าง (พอรับมือได้)  โดยทั้วไป เมธอดที่รับความผิดจากโยน จะเป็นเมธอดที่ เรียกใช้งานคนอื่น (เมธอดอื่น) จึงเป็นธรรมดาที่ต้องรู้ วิธีการจัดการผิดพลาด ที่จะมีผลตามมา C# Programming with Visual C# 2010 Express22

23 การโยนความผิดให้กับเมธอดทีเรียก 1. try 2. { 3. //สเตทเม้นท์ที่อาจเกิดความผิดพลาดขึ้นได้ 4. } 5. catch (FormatException ex) 6. { 7. //พยายามจะจัดการกับความผิดพลาดแต่ทำไม่ได้ 8. //จึงโยนความผิดให้เมธอดที่เรียกจัดการแทน 9. throw; 10. } C# Programming with Visual C# 2010 Express23

24 ตัวอย่าง การใช้ throw C# Programming with Visual C# 2010 Express24 ตัวอย่างต่อไปนี้เป็นตัวอย่าง WPF แอปพลิเคชัน ที่รับค่าตัวเลข เพื่อใช้ในการคูณ ผ่าน textbox สองกล่อง และเมื่อคลิกปุ่ม คำสั่งให้ทำงาน จะนำผลที่คูณได้ไปแสดงที่ label

25 ตัวอย่าง การใช้ throw ตัวอย่างโปรแกรมนี้ มีเมธอด Multiply( ) ที่ส่งค่าคืนในรูป short ซึ่ง ภายในเมธอดนี้จะมีการโยนความผิดพลาดเมื่อผลคูณเกินค่าที่ เก็บได้ของ short ในเมธอด Main( ) เรียกใช้งานเมธอด Multiply( ) โดยการรับค่า ข้อมูลจากกล่องข้อมูล สองกล่องข้อมูล เพื่อนำไปประมวลผล ตามเมธอด Multiply( ) ความผิดพลาดอาจเกิดขึ้นได้คือ 1. ความผิดพลาดที่เกิดจากไม่ใส่ข้อมูลอะไร 2. ความผิดพลาดที่เกิดจาก ใส่ข้อมูลเกินขนาด ชนิดข้อมูล short (ไม่ได้มาจากผลคูณ) 3. ความผิดพลาดที่เกิดจากการโยนความผิดพลาดของเมธอด Multiply( ) เมื่อผลการคูณเกิดค่าที่เก็บได้ C# Programming with Visual C# 2010 Express25

26 ตัวอย่าง การใช้ throw 1. try { 2. short x, y; 3. x = short.Parse(this.textBox1.Text); 4. y = short.Parse(this.textBox2.Text); 5. this.label1.Content = this.Multiply(x,y); } 6. catch (FormatException) { MessageBox.Show("ใส่ตัวคูณไม่อยู่ในรูปตัวเลข" ); } 7. catch (Exception ex) { MessageBox.Show(ex.Message); } 8. } 9. private short Multiply(short x, short y) { 10. try { return checked((short)(x * y)); } 11. catch (Exception) { 12. throw new OverflowException("ผลการคูณเกินค่า short"); 13. } 14. } C# Programming with Visual C# 2010 Express26

27 แนวทางการจัดการเอ็กเซ็บชัน  สำหรับวิธีที่เหมาะสมและควรสำหรับการจัดการกับเอ็กเซ็บ ด้วยการใช้กลุ่มคำสั่ง try{…} catch{…} หรือการสร้างอ๊อป เจ็คแล้วทำงานโยนด้วยคำสั่ง throw แยกได้สองแนวทางคือ การใช้ catch และ throw  ถ้าต้องการทำเป็นลำดับชัน ควรใช้ catch และความ ผิดพลาดที่มีนิยามในดอทเน็ตแล้ว  การโยนความผิดด้วยคำสั่ง throw ซึ่งได้มาจากการสร้างอ๊ อปเจ็คเอ็กเซ็บชัน ที่ไม่ควรเป็นเอ็กเซ็บชันทั่วไป เช่น คลาส Exception เพราะสามารถจัดการได้เมธอดที่เรียกใช้งานอยู่ แล้ว ควรเป็นความผิดพลาดที่เฉพาะที่เกิดขึ้นได้กับเมธอดที่ ถูกเรียกใช้งาน C# Programming with Visual C# 2010 Express27

28 คำถามทบทวน 1. เอ็กเซ็บชันมีไว้เพื่อทำอะไร 2. การเขียนเอ็กเซ็บชันไม่อยู่ในเมธอดได้หรือไม่ 3. คลาสอะไรเป็นคลาสหลักของเอ็กเซ็บชัน 4. ความผิดพลาดเกี่ยวกับตัวเลขมีขนาดเกิดชนิดข้อมูลที่จะ เก็บได้ จะจัดการกับความผิดพลาดนี้อย่างไร 5. ในกรณีที่จะจัดการกับชุดชนิดของเอ็กเซ็บชัน จะจัดการ ด้วยใช้คำสั่ง try… catch อย่างไร 6. อธิบายลำดับการงานของบล็อก try { …} catch { …} finally{… } 7. เมื่อมีการทำงานของเอ็กเซ็บชันโดยการใช้คำสั่ง throw ต่อมาจะทำงานในที่ใดต่อไป C# Programming with Visual C# 2010 Express28


ดาวน์โหลด ppt Visual C# 2010 Express 7. Exception ให้เกิดความผิดพลาดน้อยที่สุด อย่างน้อยให้ โปรแกรมทำงานต่อไปได้ 1C# Programming with Visual C# 2010 Express.

งานนำเสนอที่คล้ายกัน


Ads by Google