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
.
Contents
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ốitry
, dùng để bắt và xử lý ngoại lệ nếu có. Có thể có nhiều khốicatch
để 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:
- 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.
- Kế thừa từ
- 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.
- Kiểm tra nếu
- 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.
- Bắt ngoại lệ
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
- 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.
- 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.
- 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.