System Level Exception vs Application Level Exception

รับวาสน์ โมราสุข 650710839

Exception คืออะไร ?

Exception คือข้อผิดพลาดหรือเหตุการณ์ที่ไม่คาดคิดที่เกิดขึ้นระหว่างการทำงานของโปรแกรม ซึ่งขัดขวางขั้นตอนของคำสั่งโปรแกรม และบางครั้งก็เกิดขึ้นระหว่างการทำงานของโปรแกรม มีความเป็นไปได้ที่โปรแกรมอาจหยุดทำงานหรือเกิดเหตุการณ์ที่ unexpected ระหว่าง runtime execution


Types of Exception in C#

  • System Level Exception

  • Application Level Exception

System Level Exception in C#

  • เกิดขึ้นเมื่อพบข้อผิดพลาดร้ายแรงหรือไม่สามารถกู้คืนได้ เช่น ฐานข้อมูลล่ม ข้อผิดพลาดที่ถูกผูกไว้ etc.

  • แสดงถึง Exceptions ที่เกี่ยวข้องกับระบบ เช่น การหารด้วยศูนย์ ข้อผิดพลาดที่อยู่นอกช่วง

  • System Exceptions ได้รับการสืบทอดมาจากคลาส System.SystemException ซึ่งเป็นคลาสที่สืบทอดมาจาก SystemException

Examples

  • OutOfMemoryException: หน่วยความจำไม่เพียงพอสำหรับดำเนินการ

  • IOException: ข้อผิดพลาดในการอ่าน/เขียนข้อมูลจาก I/O เช่น ไฟล์หรือเน็ตเวิร์ค

  • StackOverflowException: เกิดจาก recursion ที่ลึกเกินไป

  • DivideByZeroException: เกิดจากการหารด้วยศูนย์

Application Level Exception in C#

  • เกิดขึ้นเมื่อพบข้อผิดพลาดที่สามารถกู้คืนได้ เช่น ข้อมูลอินพุตผิดประเภท ข้อยกเว้นทางคณิตศาสตร์ etc.

  • แสดงถึง exceptions ที่ผู้ใช้กำหนดเอง (less commonly used).

  • Application Exceptions ได้รับการสืบทอดมาจากคลาส System.ApplicationException ซึ่งเป็นคลาสที่สืบทอดมาจาก SystemException

  • โดยส่วนใหญ่แล้ว โปรแกรมจะสามารถกลับมาดำเนินการตามคำสั่งปกติได้หลังจากแก้ไข Exception ประเภทนี้แล้ว

Examples

  • InvalidArgumentException: เกิดจากการส่งพารามิเตอร์ที่ไม่ถูกต้องให้กับฟังก์ชัน

  • FileNotFoundException: หาไฟล์ที่ต้องการไม่เจอ

  • IndexOutOfRangeException: ค่าใน array ที่ index เกินขอบเขต

Code Example

System Level Exception

การอธิบายโค้ด :

  • DivideByZeroException: ใช้จับ Exception ที่พยายามทำการหารด้วยศูนย์ จะถูกแสดงใน catch block

  • Output : " DivideByZeroException occurred: Attempted to divide by zero. "

Application Level Exception

การอธิบายโค้ด :

  • IndexOutOfRangeException: ใช้จับข้อยกเว้นประเภท IndexOutOfRangeException การเข้าถึง index ที่อยู่นอกขอบเขต จะถูกแสดงใน catch block

  • Output : " Application-Level Exception: Index was outside the bounds of the array. "


C# VS Java

ภาษา Java จะมี Structure ที่แตกต่างจากภาษา C# ( ไม่มี System Exception กับ Application Exception ) โดยจะแบ่ง Exception เป็น 2 กลุ่มหลักๆ ได้แก่

  • Check Exception

คือ Exceptions ที่คอมไพเลอร์ Java ต้องการให้เราจัดการอย่างชัดเจน ซึ่งคนเขียนฟังก์ชันรู้อยู่แล้วว่ามันจะต้องเกิด Exception พวกนี้ขึ้นมาแน่ๆ เช่น IOException , FileNotFoundException etc.

  • File file = new File("fake_file.txt"); พยายามเปิดไฟล์ที่ชื่อ "fake_file.txt" ซึ่งไม่มีอยู่ ทำให้เกิด FileNotFoundException

  • Scanner scanner = new Scanner(file);: เมื่อพยายามสร้างออบเจ็กต์ Scanner จากไฟล์นี้ ระบบจะโยน FileNotFoundException เพราะไฟล์หาไม่พบ

  • Uncheck exception

คือ Runtime exception ที่คอมไพเลอร์ Java ไม่บังคับให้เราจัดการอย่างชัดเจน มักเกี่ยวข้องกับข้อผิดพลาดในการเขียนโปรแกรมที่ควรจะได้รับการแก้ไขในระหว่างการพัฒนา เช่น การใช้งาน object ที่เป็น null

จะเห็นว่าโปรแกรมไม่บังคับให้จัดการกับ exceptions ประเภทนี้ หากไม่จัดการก็ยังสามารถ compile ได้แต่ถ้ารันโปรแกรมจะเกิด NullPointerException

  • text.length() พยายามเรียกหาความยาวของ String text แต่ text มีค่าเป็น null จะทำให้เกิด NullPointerException

  • Output : "Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "text" is null at Main.main(Main.java:4) "


C# VS C

ในภาษา C ไม่มีการจัดการ Exception ที่สร้างขึ้นมาในตัว User ต้องทำการเขียนขึ้นมาเอง โดยการใช้คำสั่ง return ส่งคืนค่า -1 หรือ NULL

  • จาก divide(int a, int b) จะมีตัวเช็คว่าส่วนที่นำไปหารเป็น 0 หรือไม่ ถ้าเป็น 0 ก็จะ return -1 แต่ถ้าไม่เป็น 0 จะ return ค่าของ a การด้วย b กลับไป


C# VS Python

ภาษา Python จะมี Structure ที่แตกต่างจากภาษา C# ( ไม่มี System Exception กับ Application Exception ) จะมี Exception Handling คือ

  • try : block ที่ให้ใส่ code ปกติ ที่อาจะเกิด error ได้

  • except : block ที่เอาไว้ handle error

  • raise : block ที่ใช้สำหรับ raise error เป็นการ force exception.

  • else : block ที่จะทำงานเมื่อไม่มี exception เท่านั้น

  • finally : block ที่จะทำงานตลอด ไม่ได้สนใจว่าต้องมี exception

  • ถ้า parameters ตัวหารมีเป็นค่า 0 จะเกิด ZeroDivisionError เข้า block except และบังคับเข้า finally แต่ถ้าตัวหารไม่ใช่ 0 จะเข้า block try , else และบังคับ finally

  • เมื่อเรียกใช้ force_error() จะบังคับ raise exception


References

System Exception & Application Exception
System Exception & Application Exception
System Exception & Application Exception
Exception in C#
Exception in C#
เปรียบเทียบ C# กับ Java
เปรียบเทียบ C# กับ Java
เปรียบเทียบ C# กับ C
เปรียบเทียบ C# กับ C
เปรียบเทียบ C# กับ C
เปรียบเทียบ C# กับ Python
เปรียบเทียบ C# กับ Python
เปรียบเทียบ C# กับ Python
เปรียบเทียบ C# กับ Python
เปรียบเทียบ C# กับ Python

Last updated