Đọc bài viết của Eric Lippert về các trường hợp ngoại lệ chắc chắn là một cái nhìn thoáng qua về cách tôi nên tiếp cận các ngoại lệ, cả với tư cách là nhà sản xuất và người tiêu dùng. Tuy nhiên, tôi vẫn đang cố gắng xác định một hướng dẫn về cách tránh ném ngoại lệ.
Đặc biệt:
- Giả sử bạn có một phương thức Lưu có thể thất bại vì a) Người khác đã sửa đổi bản ghi trước bạn hoặc b) Giá trị bạn đang cố gắng tạo đã tồn tại . Các điều kiện này được dự kiến và không phải là ngoại lệ, vì vậy thay vì đưa ra một ngoại lệ, bạn quyết định tạo một phiên bản Thử của phương thức của mình, TrySave, trả về một boolean cho biết nếu việc lưu thành công. Nhưng nếu thất bại, làm sao người tiêu dùng biết vấn đề là gì? Hoặc tốt nhất là trả về một enum chỉ ra kết quả, loại Ok / RecordAlperedModified / ValueAlperedExists? Với số nguyên.TryPude vấn đề này không tồn tại, vì chỉ có một lý do mà phương thức có thể thất bại.
- Là ví dụ trước đây thực sự là một tình huống khó chịu? Hoặc sẽ ném một ngoại lệ trong trường hợp này là cách ưa thích? Tôi biết đó là cách nó được thực hiện trong hầu hết các thư viện và khung, bao gồm cả khung Thực thể.
- Làm thế nào để bạn quyết định khi nào tạo phiên bản Thử phương thức của mình so với việc cung cấp một số cách để kiểm tra trước xem phương thức đó có hoạt động hay không? Tôi hiện đang làm theo các hướng dẫn sau:
- Nếu có cơ hội điều kiện cuộc đua, thì hãy tạo phiên bản Thử. Điều này ngăn cản sự cần thiết của người tiêu dùng để bắt một ngoại lệ ngoại sinh. Ví dụ, trong phương thức Save được mô tả trước đây.
- Nếu phương thức kiểm tra điều kiện khá nhiều sẽ làm tất cả những gì phương thức ban đầu làm, thì hãy tạo một phiên bản Thử. Ví dụ: số nguyên.TryPude ().
- Trong mọi trường hợp khác, tạo một phương thức để kiểm tra điều kiện.