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
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
blockOutput : " DivideByZeroException occurred: Attempted to divide by zero. "
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
blockOutput : " 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 errorraise
: 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
Last updated