Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

Built-in Exceptions ใน C# และการจัดการข้อผิดพลาด

คีย์เวิร์ดสำหรับการจัดการ 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)
  • ใช้ using statement สำหรับทรัพยากรที่ implements IDisposable
  • Log ข้อมูล exception เพื่อการ debug