Có bất kỳ ngoại lệ nào được xác định trong Khuôn khổ .NET mà tôi không nên ném vào mã của riêng mình hay thực hành không tốt? Tôi có nên viết của riêng mình không?Trong C#, có bất kỳ ngoại lệ tích hợp nào mà tôi không nên sử dụng không?
Trả lời
Bạn không nên ném bất kỳ ngoại lệ nào được CLR tự động ném do lỗi người dùng. Ví dụ
- StackOverflowException
- NullReferenceException
- AccessViolationException
- vv ...
Lý do là để làm như vậy sẽ tạo ra sự nhầm lẫn cho người gọi API của bạn. Người dùng có thể phân biệt giữa các ngoại lệ được kích hoạt một cách chủ động bởi một API và các ngoại lệ không được chủ động ném (do CLR đưa ra).
Lý do là tại trường hợp ngoại lệ được gửi tích cực thường đại diện cho một trạng thái đã biết trong API. Nếu tôi gọi một API và nó ném một ArgumentException, tôi có một kỳ vọng hợp lý rằng đối tượng đã cho ở trạng thái tốt. Nó nhận ra một tình huống có khả năng xấu và tích cực chiếm nó. Mặt khác, nếu nó ném ra một NullRefrenceException, đó là một dấu hiệu cho thấy API đã gặp lỗi không xác định và hiện đang ở trạng thái không đáng tin cậy.
Lý do khác thấp hơn là các ngoại lệ này hoạt động khác nhau khi được ném bởi mã người dùng thay vì CLR. Ví dụ, nó có thể bắt một StackOverflowException nếu được ném bởi mã người dùng, nhưng không phải nếu nó được ném bởi CLR.
EDIT Hưởng ứng lời nhận xét của Michael
Bạn cũng không nên ném ngoại lệ, ApplicationException hoặc SystemException trực tiếp. Các loại ngoại lệ này quá chung chung để cung cấp thông tin có ý nghĩa cho mã gọi API của bạn. Đúng, bạn có thể đặt một thông điệp rất mô tả vào thông số tin nhắn. Nhưng nó không thẳng về phía trước hoặc duy trì để bắt một ngoại lệ dựa trên một thông điệp. Nó tốt hơn nhiều để bắt nó dựa trên loại.
FxCop quy tắc về chủ đề này: http://msdn.microsoft.com/en-us/library/ms182338(VS.80).aspx
có một số ngoại lệ đã được xác định cho bạn. Luôn cố gắng sử dụng các Exceptions này trước khi cuộn
@ downvoters: hãy giải thích downvotes của bạn, hoặc họ vô nghĩa – dfa
Hầu hết các lớp ngoại lệ trong khung không được sử dụng lại vì chúng thường được tạo ra để báo hiệu một số lỗi cụ thể của Khung. Giống như những người mentioned by @JaredPar, chúng được sử dụng bởi khuôn khổ để chỉ ra một số tiểu bang trong khuôn khổ.
Có nghĩa là hàng chục, có thể hàng trăm, ngoại lệ trong khuôn khổ, vì vậy IMO sẽ hữu ích hơn nếu liệt kê những thứ mà chúng tôi nên sử dụng.Ở phía trên đầu của tôi, đây là những người tôi chủ động sử dụng:
- ArgumentException, ArgumentNullException và ArgumentOutOfRangeException
- InvalidOperationException
- NotSupportedException
- NotImplementedException
Đối với điều kiện lỗi khác trong mã người dùng , thực hành tốt nhất là tạo các lớp ngoại lệ của riêng bạn.
Đồng ý. Và trên thực tế, bạn không nên ném một ngoại lệ mà một phương pháp khung sẽ ném nó thay thế. ** I.e. ** Nếu bạn đóng gói một Stack
Microsoft đã từng nói với các lập trình viên không được kế thừa trực tiếp từ Ngoại lệ, mà thay vào đó sử dụng ApplicationException làm lớp cơ sở của họ. Không chắc chắn ý kiến đó vẫn đúng ... Mặc dù ...
Và nếu ngoại lệ được xác định trước đã tồn tại bao gồm điều kiện lỗi chính xác của bạn (như "NullReferenceException" hoặc "InvalidArgumentException", v.v.) ném những thứ đó thay vì phát minh lại chúng bên trong mã của riêng bạn.
Marc
Vâng, lập trường về ApplicationException đã thay đổi. Hiện tại, bạn không nên bắt nguồn từ lớp đó: http://blogs.msdn.com/brada/archive/2004/03/25/96251.aspx – JaredPar
Giữa .NET 2.0 và 3.0 tôi nghĩ. Lời khuyên để lấy được từ ApplicationException trong .NET 2.0 vẫn tồn tại trên MSDN cho 2.0 và trước đó - http://msdn.microsoft.com/en-us/library/system.applicationexception(VS.80).aspx. Đối với phiên bản 3.0 đã thay đổi - http://msdn.microsoft.com/en-us/library/system.applicationexception(VS.85).aspx – BlackWasp
Các tuyến Design Guidelines for Exceptions chứa những lời khuyên về nguyên tắc (xem đặc biệt this trang).
Cuốn sách "Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition" có thêm chi tiết và thảo luận thêm về chủ đề này.
@Michael Thực tế là có một tình huống trong đó nó được khuyến khích để ném một NullReferenceException: Nếu tham số đầu tiên (tham số "this") của một phương thức mở rộng là null. Bạn cần làm điều này để các biến null hoạt động như mong đợi.
- 1. HttpClient bị kẹt mà không có bất kỳ ngoại lệ
- 2. Có bất kỳ hàm PHP gốc nào có ném ngoại lệ tích hợp không?
- 3. Lỗi ứng dụng mà không có bất kỳ loại ngoại lệ nào
- 4. Bất kỳ giải pháp nào đối với Ngoại lệ Chấm dứt Hoạt động Không hợp lệ?
- 5. Oracle có bất kỳ hàm băm tích hợp nào không?
- 6. Trường hợp ngoại lệ thời gian chờ ngẫu nhiên Selenium mà không có bất kỳ thông báo nào
- 7. Tôi có nên sử dụng ivars trong Objective-C không?
- 8. Sử dụng ngoại lệ cho loại không khớp trong C#
- 9. Sử dụng NUnit để kiểm tra bất kỳ loại ngoại lệ nào
- 10. Tôi nên bắt những ngoại lệ nào?
- 11. 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?
- 12. elmah: ngoại lệ mà không có HttpContext?
- 13. Có bất kỳ lý do nào khiến tôi không nên sử dụng ObjectId trong địa chỉ REST2 của tôi là
- 14. Tôi nên ném loại ngoại lệ nào?
- 15. Tôi có nên sử dụng 'Bảo mật tích hợp = True' trong môi trường sản xuất không?
- 16. WinApp Form Crash Không có bất kỳ lỗi hoặc ngoại lệ nào .Net
- 17. Có bất kỳ tên tệp linux không hợp lệ nào không?
- 18. Có bất kỳ trường hợp nào cảnh báo C4172 Visual C++ không nên được coi là lỗi không?
- 19. JavaFX ImageView mà không có bất kỳ làm mịn nào
- 20. Tôi nên đưa ra ngoại lệ nào đối với các kết hợp đối số xấu/bất hợp pháp trong Python?
- 21. C# Tôi có nên Loop cho đến khi không có ngoại lệ?
- 22. Tôi có thể viết một bài kiểm tra mà không có bất kỳ khẳng định nào trong đó không?
- 23. Ngoại lệ trong các trường hợp ngoại lệ trong C++
- 24. Mùa xuân/Hibernate Ngoại lệ: createCriteria không hợp lệ mà không có giao dịch hoạt động
- 25. Có thể/Bạn có nên ném ngoại lệ trong câu lệnh chuyển đổi C# không?
- 26. Tôi có thể tắt ngoại lệ trong STL không?
- 27. Tôi có nên sử dụng ProGuard không?
- 28. Chương trình Java chấm dứt bất ngờ mà không có bất kỳ thông báo lỗi nào
- 29. Ngoại lệ không ngừng trong C#
- 30. Loại ngoại lệ nào nên được sử dụng trong Powershell để bắt lỗi phân tích cú pháp XML do các ký tự không hợp lệ?
Tôi đồng ý, ngoại trừ NullReferenceException ... trừ khi nó hoạt động khác nhau, tôi nghĩ rằng nó hợp lệ để ném điều này khi ai đó vượt qua null như một tham số không thể rỗng. – Eddie
@Eddie bạn nên sử dụng ArgumentNullException thay vì NullReferenceException. Và có nó hành vi khác nhau. Nó sẽ có một mã HRESULT khác nhau. – JaredPar
Bạn nên thêm "Ngoại lệ" vào danh sách. Cách duy nhất để bắt nó sẽ là nuốt _all_ ngoại lệ. – Michael