คีย์เวิร์ดสำหรับการจัดการ Exception
ใน C# มีคีย์เวิร์ดหลัก 4 ตัวสำหรับจัดการข้อยกเว้น (Exception Handling):
1. try
บล็อกโค้ดที่อาจเกิดข้อผิดพลาดขึ้น จะถูกวางไว้ในบล็อก try
2. catch
ใช้สำหรับจับ (catch) ข้อยกเว้นที่เกิดขึ้น และจัดการให้เหมาะสม
3. finally
บล็อกที่จะทำงาน เสมอ ไม่ว่าจะมีข้อยกเว้นเกิดขึ้นหรือไม่ก็ตาม ใช้สำหรับทำความสะอาดทรัพยากร
4. throw
ใช้สำหรับโยน (throw) ข้อยกเว้นขึ้นไปยังระดับบน หรือสร้างข้อยกเว้นใหม่
ลำดับชั้นของ Exception ใน .NET
Exception ทั้งหมดสืบทอดมาจาก System.Exception โดยมีกลุ่มสำคัญดังนี้:
- SystemException - ข้อผิดพลาดจากระบบ (NullReferenceException, IndexOutOfRangeException, ฯลฯ)
- ApplicationException - ข้อผิดพลาดจากแอปพลิเคชัน (สำหรับ custom exceptions)
ตัวอย่างการจัดการ DivideByZeroException
using System;
namespace ExceptionHandlingDemo
{
class DivNumbers
{
int result;
public DivNumbers()
{
result = 0;
}
public void MyDivision(int num1, int num2)
{
try
{
result = num1 / num2;
}
catch (DivideByZeroException e)
{
Console.WriteLine("จับข้อยกเว้น: {0}", e.Message);
}
finally
{
Console.WriteLine("ผลลัพธ์: {0}", result);
}
}
static void Main(string[] args)
{
DivNumbers d = new DivNumbers();
d.MyDivision(5, 0); // หารด้วยศูนย์
Console.ReadKey();
}
}
}
ผลลัพธ์
จับข้อยกเว้น: Attempted to divide by zero.
ผลลัพธ์: 0
Exception ที่พบบ่อยใน C#
| Exception | สาเหตุ |
|---|---|
| NullReferenceException | เข้าถึงสมาชิกของออบเจกต์ที่เป็น null |
| IndexOutOfRangeException | เข้าถึงอาร์เรย์ด้วยดัชนีเกินขอบเขต |
| ArgumentNullException | ส่งอาร์กิวเมนต์เป็น null ไปให้เมธอดที่ไม่อนุญาต |
| InvalidOperationException | เรียกเมธอดในสถานะที่ไม่เหมาะสม |
| FileNotFoundException | ไม่พบไฟล์ที่ระบุ |
Best Practices
- จับ exception ที่เฉพาะเจาะจง (specific) ก่อน แล้วค่อยจับ exception ทั่วไป (general)
- หลีกเลี่ยงการจับ Exception แล้วไม่ทำอะไร (empty catch)
- ใช้
usingstatement สำหรับทรัพยากรที่ implements IDisposable - Log ข้อมูล exception เพื่อการ debug