Phương pháp hay nhất khi tạo các lớp ngoại lệ của bạn trong một giải pháp .NET: Để lấy được từ System.Exception
hoặc từ System.ApplicationException
?Tôi có nên lấy ngoại lệ tùy chỉnh từ Ngoại lệ hoặc ApplicationException trong .NET không?
Trả lời
Theo Jeffery Richter trong cuốn sách Khung Hướng dẫn thiết kế:
System.ApplicationException
là một lớp học mà không phải là một phần của .NET framework.
Nó được dự định có một số ý nghĩa trong đó bạn có khả năng có thể bắt "tất cả" ngoại lệ của ứng dụng, nhưng mẫu không được theo dõi và do đó không có giá trị.
ApplicationException
considered useless là một đối số mạnh mẽ và quan trọng đối với ApplicationException
.
Ảnh chụp nhanh: không sử dụng. Có nguồn gốc từ Exception
.
Yeah, Konrad có nó ngay. Trên một lưu ý liên quan: một điều khác nghĩ hữu ích (hoặc "thực hành tốt nhất") nhưng thực sự không phải là [triển khai ICloneable] (http://blogs.msdn.com/brada/archive/2003/04/09/49935.aspx). – Craig
Các tác giả của khuôn khổ này tự xem xét ApplicationException vô giá trị:
http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx
với theo dõi tốt đẹp ở đây:
http://blogs.msdn.com/kcwalina/archive/2006/07/05/657268.aspx
Khi nghi ngờ, tôi làm theo thiết kế Khung cuốn sách của họ Hướng dẫn.
http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756
Chủ đề của bài đăng blog là tiếp tục thảo luận ở đó.
rp
Tôi đang sử dụng để làm:
private void buttonFoo_Click()
{
try
{
foo();
}
catch(ApplicationException ex)
{
Log.UserWarning(ex);
MessageVox.Show(ex.Message);
}
catch(Exception ex)
{
Log.CodeError(ex);
MessageBox.Show("Internal error.");
}
}
Nó cho phép để làm sự khác biệt giữa:
- C# hệ thống mã lỗi mà tôi phải sửa chữa.
- Lỗi người dùng "thông thường" không cần chỉnh sửa từ tôi.
Tôi biết không nên sử dụng ApplicationException, nhưng nó hoạt động tốt vì có very few classes không tôn trọng mẫu ApplicationException.
Rất ít bạn biết. Bất kỳ ai tuân thủ Nguyên tắc thiết kế khung sẽ không được lấy từ ApplicationException. Nếu bạn muốn duy trì mẫu này, thì bạn cần phải tạo kiểu của riêng mình như MyApplicationExcptionBase và lấy được tất cả các ngoại lệ tùy chỉnh của bạn từ đó. BTW, các hướng dẫn nói để tạo ra vài loại ngoại lệ có nguồn gốc. –
Bạn nói đúng: hôm nay, nếu tôi phải bắt đầu từ đầu, tôi sẽ tạo ra một ngoại lệ "UserError". Tuy nhiên, tôi sẽ không refactor mã cũ của tôi: nó không phải là rất phê bình. –
Bạn nên lấy ngoại lệ tùy chỉnh từ System.Exception
.
Thậm chí MSDN nói ngay bây giờ để bỏ qua ApplicationException
:
Nếu bạn đang thiết kế một ứng dụng mà cần phải tạo riêng trường hợp ngoại lệ của nó, bạn nên để lấy được ngoại lệ tùy chỉnh từ ngoại lệ lớp.Ban đầu, người ta nghĩ rằng ngoại lệ tùy chỉnh sẽ xuất phát từ lớp ApplicationException; tuy nhiên trong thực tế điều này đã không được tìm thấy để thêm giá trị đáng kể. Để biết thêm thông tin, hãy xem Best Practices for Handling Exceptions.
http://msdn.microsoft.com/en-us/library/system.applicationexception.aspx
Trích dẫn nói rằng, nhưng ok, chỉnh sửa để rõ ràng hơn. – Blorgbeard
- 1. Lớp Ngoại lệ tùy chỉnh - kéo dài từ Ngoại lệ hoặc Thowable?
- 2. Tại sao tôi nên luôn tạo ngoại lệ [serializable]? (NET)
- 3. Ngoại lệ tùy chỉnh trong C++
- 4. Tại sao tạo ngoại lệ tùy chỉnh?
- 5. Ném ngoại lệ tùy chỉnh trong Java
- 6. Xử lý ngoại lệ tùy chỉnh php
- 7. boost :: python Xuất ngoại lệ tùy chỉnh
- 8. Trả lại ngoại lệ tùy chỉnh
- 9. Bắt nhiều ngoại lệ tùy chỉnh? - C++
- 10. Điều kiện ngoại lệ tùy chỉnh PostgreSQL
- 11. Tôi nên bắt những ngoại lệ nào?
- 12. Boost.Python lớp ngoại lệ tùy chỉnh
- 13. Tôi nên ném loại ngoại lệ nào?
- 14. Bắt ngoại lệ ArgumentTypeError từ hành động tùy chỉnh
- 15. Bắt ngoại lệ tùy chỉnh từ Dịch vụ web ASMX
- 16. Ném nhiều ngoại lệ trong .Net/C#
- 17. Cách tắt "Ngắt khi ngoại lệ được ném" cho các loại ngoại lệ tùy chỉnh
- 18. Bạn có viết ngoại lệ cho các vấn đề cụ thể hoặc ngoại lệ chung không?
- 19. Ngoại lệ và lỗi tùy chỉnh NSException và NSError
- 20. Xử lý ngoại lệ tùy chỉnh trong Spring Security
- 21. Xử lý các ngoại lệ C++ tùy chỉnh trong Cython
- 22. Phần cấu hình tùy chỉnh .NET: Configuration.GetSection ném 'không thể định vị assembly' ngoại lệ
- 23. Bạn có nên bắt tất cả ngoại lệ không?
- 24. Cách xác định ngoại lệ tùy chỉnh trong Haskell?
- 25. Tùy chọn so với Ngoại lệ trong xử lý ngoại lệ
- 26. Triển khai .NET Gridview với SqlDataSource - chỉnh sửa ngoại lệ
- 27. ruby - tăng ngoại lệ với ngoại lệ
- 28. Tôi có thể tắt ngoại lệ trong STL không?
- 29. Xử lý lỗi Tôi có nên ném ngoại lệ không? Hoặc xử lý tại nguồn?
- 30. Ngoại lệ trong các trường hợp ngoại lệ trong C++
Thật đáng kinh ngạc khi xem xét tài liệu của Microsoft Press cho kỳ thi MCTS 70-536 rõ ràng nói ngược lại ... gah! –
Không bao giờ hoàn toàn tin tưởng các cuốn sách thi MS. Tôi đã đọc vài trong số họ - luôn luôn đầy lỗi. – user1068352
Điều này không thực sự trả lời câu hỏi. Bạn có nói rằng ngoại lệ ứng dụng tùy chỉnh nên kế thừa từ 'Ngoại lệ'? Nếu vậy, bạn có thể nói như vậy? –