Tôi sẽ bắt đầu với Nguyên tắc thiết kế cho các ngoại lệ ngắn và bao gồm DO, KHÔNG và TRÁNH. Nó cũng đưa ra lý do tại sao.
Trong trường hợp ví dụ của bạn, phần tiết lộ sẽ là Gói ngoại lệ
Và sẽ mong đợi nó được viết theo cách này. Lưu ý rằng nó bắt được một ngoại lệ cụ thể và cố gắng thêm thông tin để thông điệp có ý nghĩa hơn được lan truyền. Cũng lưu ý rằng ngoại lệ bên trong vẫn được duy trì cho mục đích ghi nhật ký
//In DataLayer
try
{
XDocument xd_XmlDocument = XDocument.Load("systems.xml");
}
catch(FileNotFoundException ex)
{
throw new TransactionFileMissingException(
"Cannot Access System Information",ex);
}
CẬP NHẬT
Kanini hỏi có đúng không khi có khối ngoại lệ này trong Lớp dữ liệu hoặc việc kiểm tra tệp có sẵn cho Lớp doanh nghiệp hay không.
Vâng, trước tiên tôi muốn chỉ ra rằng lý do căn bản cho các trường hợp ngoại lệ là đây
Xem xét gói các ngoại lệ cụ thể được ném từ lớp thấp hơn trong một ngoại lệ phù hợp hơn, nếu ngoại lệ lớp thấp hơn không có ý nghĩa trong bối cảnh của hoạt động của lớp cao hơn.
Vì vậy, nếu bạn cảm thấy rằng có một lớp cao hơn nên biết về tệp thì lớp dữ liệu của bạn sẽ trông như thế này
//In DataLayer
XDocument xd_XmlDocument = XDocument.Load("systems.xml");
Không thử không bắt.
Cá nhân tôi cảm thấy rằng trừ khi lớp dữ liệu của bạn có thể làm một cái gì đó hữu ích như sử dụng một hệ thống mặc định là tài nguyên lắp ráp, không làm gì hoặc gói ngoại lệ là một đặt cược tốt vì việc ghi nhật ký của bạn sẽ cho bạn biết phương pháp nào và vấn đề của tệp nào. ( throw ex
trong trường hợp này hoặc ưu tiên throw
cũng vậy nhưng không thêm giá trị). Điều này có nghĩa là một khi đã xác định bạn sẽ có thể khắc phục sự cố nhanh chóng.
Như một sự khẳng định ví dụ cụ thể này cũng có vấn đề sau trong XDocument. Tải có thể ném bốn lần thực thi
- Đối sốNullException
- Ngoại lệ an ninh
- FileNotFoundException
- Ngoại lệ UriFormat
Chúng tôi không thể đảm bảo một cách an toàn rằng mã sau sẽ không ném và FileNotFoundException, đơn giản vì nó có thể ở đó khi chúng tôi kiểm tra sự tồn tại và biến mất khi chúng tôi tải. Có sẵn cho lớp kinh doanh sẽ không giúp đỡ.
if (File.Exists("systems.xml"))
XDocument.Load("systems.xml");
SecurityException thậm chí còn tồi tệ hơn vì trong số các lý do khác khiến việc này bị ném nếu một quá trình khác có khóa tệp độc quyền, bạn sẽ không gặp lỗi cho đến khi bạn thử mở nó để đọc vì không có phương thức File.CanIOpen This (). Và nếu phương thức đó tồn tại, bạn vẫn gặp vấn đề tương tự như với File.Exists