Exception
là kiểu cơ sở cho tất cả các trường hợp ngoại lệ và như vậy là không cụ thể. Bạn không bao giờ nên ném ngoại lệ này vì nó chỉ đơn giản là không chứa bất kỳ thông tin hữu ích nào. Việc gọi mã bắt mã cho các ngoại lệ không thể phân biệt ngoại lệ được cố ý ném (theo logic của bạn) với các ngoại lệ hệ thống khác hoàn toàn không mong muốn và chỉ ra các lỗi thực sự.
Lý do tương tự cũng áp dụng cho SystemException
. Nếu bạn nhìn vào danh sách các kiểu dẫn xuất, bạn có thể thấy một số lượng lớn các ngoại lệ khác với ngữ nghĩa rất khác nhau.
NullReferenceException
và IndexOutOfRangeException
thuộc một loại khác. Bây giờ đây là những ngoại lệ rất cụ thể, vì vậy bạn có thể ném chúng đi . Tuy nhiên, bạn vẫn sẽ không muốn ném chúng đi, vì chúng thường có nghĩa là có một số sai lầm thực tế trong logic của bạn. Ví dụ, ngoại lệ tham chiếu null có nghĩa là bạn đang cố gắng truy cập vào một thành viên của một đối tượng null
. Nếu đó là một khả năng xảy ra trong mã của bạn, thì bạn nên luôn kiểm tra rõ ràng null
và thay vào đó đưa ra một ngoại lệ hữu ích hơn (ví dụ ArgumentNullException
). Tương tự, IndexOutOfRangeException
s xảy ra khi bạn truy cập một chỉ mục không hợp lệ (trên mảng — không phải danh sách). Bạn phải luôn đảm bảo rằng bạn không làm điều đó ngay từ đầu và kiểm tra ranh giới của ví dụ một mảng trước.
Ví dụ , có một vài trường hợp ngoại lệ khác như hai trường hợp đó InvalidCastException
hoặc DivideByZeroException
được đưa ra cho các lỗi cụ thể trong mã của bạn và thường có nghĩa là bạn đang làm sai hoặc bạn không kiểm tra một số giá trị không hợp lệ trước. Bằng cách cố ý ném chúng khỏi mã của bạn, bạn chỉ làm cho mã gọi khó xác định xem chúng bị ném do lỗi nào đó trong mã hay chỉ vì bạn quyết định sử dụng lại chúng cho một cái gì đó trong quá trình triển khai của mình.
Tất nhiên, có một số ngoại lệ (hah) đối với các quy tắc này. Nếu bạn đang xây dựng một thứ gì đó có thể gây ra một ngoại lệ khớp chính xác với một cái hiện có, thì hãy thoải mái sử dụng cái đó, đặc biệt nếu bạn đang cố gắng khớp một số hành vi được tạo sẵn. Chỉ cần đảm bảo rằng bạn chọn một loại ngoại lệ rất cụ thể sau đó.
Nói chung, mặc dù vậy, trừ khi bạn tìm thấy một ngoại lệ (cụ thể) đáp ứng nhu cầu của mình, bạn nên luôn cân nhắc tạo các loại ngoại lệ của riêng mình cho các ngoại lệ dự kiến cụ thể. Đặc biệt khi bạn đang viết mã thư viện, điều này có thể rất hữu ích để tách các nguồn ngoại lệ.