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

using System;

class Main {
    static void Main() {
        try {
            int num = 10;
            int zero = 0;
            int result = num/zero;  //DivideByZeroException
            Console.WriteLine("Result: " + result);
        } catch (DivideByZeroException ex)  { // จับ exeption เมื่อมีการหารด้วยศูนย์
            Console.WriteLine("DivideByZeroException occurred: " + ex.Message);
        }
    }
}

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

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

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

Application Level Exception

using System;

class Main {
    static void Main() {
        try {
            int[] num = { 1, 2, 3 };
            Console.WriteLine(numbers[5]);  // พยายามเข้าถึง index ที่อยู่นอกขอบเขต IndexOutOfRangeException
        } catch (IndexOutOfRangeException ex) {
            Console.WriteLine("Application-Level Exception: " + ex.Message);
        }
    }
}

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

  • 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.

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        try {
            File file = new File("fake_file.txt");
            Scanner scanner = new Scanner(file);
        } catch (FileNotFoundException ex) {
            System.out.println("Not Found File Path");
        }
    }
}
  • 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

public class Main {
    public static void main(String[] args) {
        String text = null;
        int length = text.length();  //NullPointerException
        System.out.println("Length of the string: " + length);
    }
}

จะเห็นว่าโปรแกรมไม่บังคับให้จัดการกับ 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

#include <stdio.h>

int divide(int a, int b) {
    if (b == 0) {
        return -1;
    }  // ถ้าหารด้วยศูนย์ จะส่งคืน -1
    return a / b;
}

int main() {
    int result = divide(10, 0);

    if (result == -1){ 
        printf("Error: Division by zero.\n");
    } else {
        printf("Result: %d\n", result);
    }
    return 0;
}
  • จาก 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

def divide(a, b):
    try:
        result = a / b
    except ZeroDivisionError:
        print("Error: Cannot divide by zero.")
    else:
        print("The result is:", result)
    finally:
        print("Execution complete.")

def force_error():
    try:
        raise ValueError("This is a forced error.")
    except ValueError as ve:
        print("Caught an error:", ve)
    finally:
        print("Forced exception handling complete.")
        
divide(10, 2)  # ไม่มี exception
divide(10, 0)  # หารด้วย 0 เกิด ZeroDivisionError
force_error()  # บังคับ raise 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