25 tháng 8, 2025 #Phát Triển Phần Mềm
Scott DePouw, Senior Consultant
Các ngoại lệ được ném ra trong mã để chỉ ra rằng có điều gì đó đã xảy ra không đúng. Lý do chúng ta có ngoại lệ thay vì chỉ để chương trình sập với mã trả về khác không là để thu thập thông tin về lý do tại sao điều xấu xảy ra. Hầu hết các ngôn ngữ lập trình đều có một số hình thức thu thập thông tin lỗi bất ngờ, từ các ngoại lệ đến panicking, vì chúng là một công cụ quan trọng trong việc chẩn đoán nguyên nhân của hành vi không mong đợi.
Mục lục
Biểu Đạt Lỗi Bằng Thuật Ngữ Miền Ứng Dụng
Giả sử có một ứng dụng ngân hàng đơn giản, với phương thức Deposit(decimal amount), có quy tắc nghiệp vụ là “số tiền được cung cấp phải lớn hơn 0.” Chúng ta có thể sử dụng một ngoại lệ mặc định để ném ra lỗi khi quy tắc này bị vi phạm:
public void Deposit(decimal amount)
{
if (amount <= 0) throw new ArgumentOutOfRangeException($"Deposit amount must be greater than 0. Given {amount}");
// Deposit the amount.
}
Nếu chúng ta đi sâu vào stack trace của ngoại lệ này hoặc xem xét chi tiết của nó, chúng ta sẽ tìm thấy lỗi. Nhưng thay vì dựa vào các chuỗi ký tự ma thuật hoặc phải đi qua kiểu ngoại lệ mặc định, tại sao không chỉ biểu đạt lỗi bằng thuật ngữ miền? Hãy cập nhật phương thức của chúng ta với một ngoại lệ tùy chỉnh thay thế.
// Định nghĩa một ngoại lệ tùy chỉnh trong file riêng của nó
public class DepositAmountMustBePositiveException(decimal invalidAmount)
: ArgumentOutOfRangeException($"Deposit amount must be greater than 0. Given {invalidAmount}");
// Quay lại class của chúng ta
public void Deposit(decimal amount)
{
if (amount <= 0) throw new DepositAmountMustBePositiveException(amount);
// Deposit the amount.
}
Chúng ta đã đạt được gì?
- Bản thân ngoại lệ thông báo cho chúng ta chính xác điều gì đã xảy ra sai, mà không cần phải đi sâu vào chi tiết.
- Nếu chúng ta kiểm tra số tiền gửi ở bất kỳ nơi nào khác vì bất kỳ lý do gì, giờ đây chúng ta có thể tái sử dụng cùng một ngoại lệ mà không cần sao chép và dán chuỗi lỗi
- Thay vì một lỗi “Tham số nằm ngoài phạm vi” chung chung, chúng ta đang biểu đạt lỗi của mình bằng thuật ngữ miền của chúng ta.
- Bằng cách làm cho ngoại lệ của chúng ta kế thừa từ
ArgumentOutOfRangeException, chúng ta vẫn truyền đạt cùng một vấn đề cơ bản, ngoại trừ việc chúng ta cung cấp bối cảnh.
Kiểm Thử Các Ngoại Lệ Tùy Chỉnh
Có hai loại kiểm thử đơn vị thường liên quan đến các ngoại lệ tùy chỉnh:
- Kiểm thử chính dữ liệu ngoại lệ, cho những thứ như điểm dữ liệu hoặc thông điệp phải được bao gồm.
- Kiểm thử các cách sử dụng nó trong ứng dụng, đảm bảo nó được ném ra trong các trường hợp chính xác.
Nhìn vào ngoại lệ tùy chỉnh DepositAmountMustBePositiveException của chúng ta, chúng ta có thể muốn khẳng định rằng thông điệp chứa giá trị số tiền gửi không hợp lệ. Vì các ngoại lệ chỉ là các lớp, một bài kiểm thử có thể chỉ cần khởi tạo một thể hiện mới của lớp ngoại lệ, và khẳng định chuỗi Message của nó chứa giá trị mong muốn.
Đừng Ngại: Tạo Các Ngoại Lệ Tùy Chỉnh!
Như đã thiết lập, các kiểu ngoại lệ tùy chỉnh rất dễ dàng để tạo và duy trì. Bạn có thể thấy mình tạo ra rất nhiều một khi bạn nội hóa điều này, và điều đó thật tuyệt. Biểu đạt lỗi bằng thuật ngữ của riêng bạn (miền) dẫn đến việc lỗi được phát hiện và sửa chữa nhanh hơn. Nó dẫn đến việc các bài kiểm thử dễ đọc hơn, dễ viết hơn và tránh được dương tính giả. Nó cho phép phân chia dữ liệu lỗi và thông điệp, tránh phải sao chép các chuỗi và định dạng trên khắp ứng dụng của bạn. Hãy thực hành và tạo ra một số ngoại lệ tùy chỉnh!



