28 Exception

Trong lập trình C#, ngoại lệ (exception) là các tình huống lỗi xảy ra trong quá trình thực thi chương trình, chẳng hạn như chia cho số 0, truy cập mảng ngoài phạm vi, hoặc thao tác trên đối tượng null. Để quản lý và xử lý các ngoại lệ này, C# cung cấp cơ chế xử lý ngoại lệ thông qua các khối lệnh try, catch, finally, và từ khóa throw.

1. Cấu trúc try, catch, finally

  • try: Được sử dụng để bao quanh đoạn mã có thể phát sinh ngoại lệ.
  • catch: Theo sau khối try, dùng để bắt và xử lý ngoại lệ nếu có. Có thể có nhiều khối catch để xử lý các loại ngoại lệ khác nhau.
  • finally: (Tùy chọn) Được sử dụng để thực thi đoạn mã bất kể ngoại lệ có xảy ra hay không, thường dùng để giải phóng tài nguyên.

Ví dụ:

try
{
    // Đoạn mã có thể gây ra ngoại lệ
    int result = 10 / divisor;
}
catch (DivideByZeroException ex)
{
    // Xử lý ngoại lệ chia cho 0
    Console.WriteLine("Lỗi: Chia cho số 0.");
}
catch (Exception ex)
{
    // Xử lý các ngoại lệ khác
    Console.WriteLine($"Lỗi: {ex.Message}");
}
finally
{
    // Đoạn mã luôn được thực thi
    Console.WriteLine("Kết thúc xử lý.");
}

2. Từ khóa throw

Từ khóa throw được sử dụng để phát sinh một ngoại lệ, có thể là ngoại lệ hệ thống hoặc ngoại lệ tự định nghĩa.

Ví dụ:

if (divisor == 0)
{
    throw new DivideByZeroException("Không thể chia cho số 0.");
}

3. Tạo ngoại lệ tùy chỉnh

Bạn có thể tạo các lớp ngoại lệ riêng bằng cách kế thừa từ lớp Exception để phản ánh các tình huống lỗi cụ thể trong ứng dụng.

Ví dụ:

public class DataTooLongException : Exception
{
    public DataTooLongException()
        : base("Dữ liệu quá dài.")
    {
    }
}

Sử dụng ngoại lệ tùy chỉnh:

void ProcessData(string data)
{
    if (data.Length > 10)
    {
        throw new DataTooLongException();
    }
    // Xử lý dữ liệu
}

try
{
    ProcessData("Dữ liệu vượt quá độ dài cho phép.");
}
catch (DataTooLongException ex)
{
    Console.WriteLine(ex.Message);
}

4. Lưu ý khi xử lý ngoại lệ

  • Sử dụng finally để giải phóng tài nguyên: Đảm bảo rằng các tài nguyên như tệp tin, kết nối cơ sở dữ liệu được giải phóng đúng cách.
  • Không lạm dụng ngoại lệ: Chỉ sử dụng cơ chế ngoại lệ cho các tình huống lỗi bất thường, không nên dùng cho luồng điều khiển thông thường.
  • Ghi nhật ký lỗi: Ghi lại thông tin chi tiết về ngoại lệ để hỗ trợ việc gỡ lỗi và bảo trì.

5. Exception tùy chỉnh

1. Tạo Exception tùy chỉnh

Khi cần xử lý một lỗi đặc thù trong ứng dụng, bạn có thể tạo một lớp ngoại lệ tùy chỉnh kế thừa từ Exception. Dưới đây là cách tạo và sử dụng ngoại lệ tùy chỉnh:

Ví dụ: Tạo Exception tùy chỉnh

Trong ví dụ này, chúng ta sẽ tạo một ngoại lệ tùy chỉnh có tên là InvalidAgeException để kiểm tra tính hợp lệ của tuổi khi người dùng nhập.

using System;

public class InvalidAgeException : Exception
{
    public InvalidAgeException() : base("Tuổi không hợp lệ. Tuổi phải lớn hơn 0 và nhỏ hơn 150.") { }

    public InvalidAgeException(string message) : base(message) { }

    public InvalidAgeException(string message, Exception innerException) : base(message, innerException) { }
}

2. Sử dụng Exception tùy chỉnh

Ví dụ: Kiểm tra tuổi hợp lệ

using System;

public class Program
{
    public static void CheckAge(int age)
    {
        if (age <= 0 || age > 150)
        {
            throw new InvalidAgeException($"Tuổi {age} không hợp lệ. Tuổi phải nằm trong khoảng từ 1 đến 150.");
        }

        Console.WriteLine($"Tuổi {age} là hợp lệ.");
    }

    public static void Main(string[] args)
    {
        try
        {
            Console.WriteLine("Nhập tuổi:");
            int age = int.Parse(Console.ReadLine());

            // Gọi phương thức kiểm tra tuổi
            CheckAge(age);
        }
        catch (InvalidAgeException ex)
        {
            Console.WriteLine($"Lỗi: {ex.Message}");
        }
        catch (FormatException ex)
        {
            Console.WriteLine("Lỗi: Vui lòng nhập số nguyên hợp lệ.");
        }
        finally
        {
            Console.WriteLine("Kết thúc chương trình.");
        }
    }
}

Giải thích:

  1. Tạo lớp InvalidAgeException:
    • Kế thừa từ Exception.
    • Định nghĩa các constructor khác nhau để hỗ trợ thông báo lỗi tùy chỉnh.
  2. Phương thức CheckAge(int age):
    • Kiểm tra nếu age không nằm trong khoảng hợp lệ (1–150).
    • Ném ngoại lệ InvalidAgeException với thông báo cụ thể nếu điều kiện không được thỏa mãn.
  3. Khối try-catch:
    • Bắt ngoại lệ InvalidAgeException để xử lý lỗi về tuổi.
    • Bắt ngoại lệ FormatException nếu người dùng nhập sai kiểu dữ liệu.

Kết quả chạy chương trình

Trường hợp 1: Người dùng nhập tuổi không hợp lệ

Nhập tuổi:
200
Lỗi: Tuổi 200 không hợp lệ. Tuổi phải nằm trong khoảng từ 1 đến 150.
Kết thúc chương trình.

Trường hợp 2: Người dùng nhập ký tự không hợp lệ

Nhập tuổi:
abc
Lỗi: Vui lòng nhập số nguyên hợp lệ.
Kết thúc chương trình.

Trường hợp 3: Người dùng nhập tuổi hợp lệ

Nhập tuổi:
25
Tuổi 25 là hợp lệ.
Kết thúc chương trình.

3. Lợi ích của Exception tùy chỉnh

  1. Dễ hiểu hơn: Tạo ngoại lệ cụ thể giúp thông báo lỗi rõ ràng và dễ đọc hơn.
  2. Tái sử dụng: Ngoại lệ tùy chỉnh có thể được sử dụng ở nhiều nơi khác nhau trong ứng dụng.
  3. Dễ bảo trì: Khi gặp lỗi đặc thù, ngoại lệ tùy chỉnh giúp bạn dễ dàng xác định và sửa lỗi.
Để lại một bình luận 0

Your email address will not be published. Required fields are marked *