Có bất kỳ điểm nào trong việc có com.myco.myproj.MyProjRuntimeException, mà completley mở rộng RuntimeException không?Tại sao có một dự án RuntimeException cụ thể?
Trả lời
Có. Làm ném bỏ chọn ngoại lệ và phân lớp chúng.
Có nhiều cuộc trò chuyện về việc liệu ngoại lệ đã kiểm tra có thực sự tốt hay không. Tóm lại, nếu tôi ném một ngoại lệ đã kiểm tra, liệu khách hàng của tôi có thực sự có liên quan gì đến nó không?
Trường hợp ngoại lệ không được kiểm tra là cách tốt để thông báo cho khách hàng của bạn về các tình huống đặc biệt (bao gồm tiền điều kiện bất hợp pháp) và chưa gây phiền toái cho họ khi có nhu cầu kết nối cuộc gọi đến API của bạn với các khối try-catch, phần lớn thời gian về cơ bản không phục vụ mục đích gì ngoài việc gỡ lỗi, truy tìm, v.v.
Vậy tại sao không ném RuntimeException
? Nó không phải là thanh lịch và nó là ít có thể đọc được. Làm cho nó ngoại lệ của riêng bạn mà xuất phát từ nó, ngay cả khi nó không có lý do khác hơn là cụ thể hơn khi ném ngoại lệ.
Khi ngoại lệ (được kiểm tra hoặc không) không được dịch sang loại phù hợp với từng mức độ trừu tượng, sự rò rỉ trừu tượng. Nếu bạn không thực sự phục hồi từ trường hợp ngoại lệ, nhưng chỉ đơn giản là bắt Throwable và báo cáo nó, đây không phải là một vấn đề. Nhưng nếu bạn muốn khôi phục từ một số trường hợp ngoại lệ, bạn phải dịch chúng ở một số lớp xen kẽ hoặc kết thúc với sự phụ thuộc vào ngoại lệ dành riêng cho việc triển khai. – erickson
Xin lỗi vì sự chậm trễ trong việc chấp nhận, newbie. Tôi đã được ném RuntimeExceptions thô trong một thời gian, trước đây đã tạo của riêng tôi. Khi tôi bắt gặp chúng ngay bây giờ, xem xét lại mã, chúng trông xấu xí. Tôi bây giờ sẽ ủng hộ trở lại phong cách ban đầu của tôi: tạo các lớp con có ý nghĩa của RuntimeException. – TimP
trễ 2.5 năm;) –
Không thực sự. Các thông tin bổ sung bạn nhận được từ việc có tên ngoại lệ hiển thị trong một dấu vết ngăn xếp có thể được đưa ra bằng cách chỉ cần thiết lập chuỗi thông báo của một tiêu chuẩn RuntimeException
. Tuy nhiên (hãy nghĩ về nó), nó có thể hữu ích để phân lớp RuntimeException
chỉ đơn giản là để thêm một chuỗi tùy chỉnh vào bất kỳ thư nào.
Tôi có xu hướng chỉ thực hiện các ngoại lệ được kiểm tra tùy chỉnh; nói chung, các ngoại lệ tiêu chuẩn không được kiểm tra bao gồm đủ các trường hợp tiềm năng rồi.
Đó là một phong cách tốt để duy trì phân cấp ngoại lệ của riêng bạn.
Nhưng tôi đã thấy chỉ một vài người có thể sử dụng kỹ thuật này với lợi nhuận thực sự.
trong Java hiệu quả, Joshua Bloch viết: ngoại lệ
Sử dụng thời gian chạy để chỉ lỗi lập trình. Đại đa số ngoại lệ thời gian chạy cho biết vi phạm điều kiện tiên quyết.
Điều đó đang được nói, bạn có thể sử dụng ngoại lệ thời gian chạy đó làm lớp cơ sở cho một hệ thống phân cấp ngoại lệ thời gian chạy, được sử dụng trong dự án của bạn. Bằng cách đó, lỗi trở nên rõ ràng hơn và có thể theo dõi được.
Tùy thuộc vào việc bạn có muốn xử lý tình trạng ngoại lệ khác với các ngoại lệ khác ở xa hơn ngăn xếp cuộc gọi hay không. Nếu bạn định bắt và xử lý ngoại lệ, thì tôi khuyên bạn nên tạo loại tùy chỉnh. Nó làm cho mã dễ đọc hơn và các điều khoản bắt sạch hơn. Nếu bạn không bắt được ngoại lệ, thì có lẽ ít lý do để tạo một loại mới.
Nhiều người (tôi và nhà thiết kế của C# được bao gồm) believe ngoại lệ đã kiểm tra là một thử nghiệm ngôn ngữ không thành công và tránh chúng. Sau đó, tạo ra hệ thống phân cấp ngoại lệ của riêng bạn dưới RuntimeException là một bước rõ ràng.
Rod Jonhson đã viết về điều này trong thiết kế và phát triển J2EE từng người một và như trong câu trả lời của Tom RuntimeException nên được sử dụng cho các lỗi lập trình. Một ví dụ tốt là SQLException, API truy cập dữ liệu cấp thấp hơn nên bắt chúng và ném "SQLRuntimeException" của riêng bạn vì phần lớn thời gian mã gọi không thể làm bất kỳ điều gì với ngoại lệ. Bằng cách này, apis cấp cao hơn của bạn không bắt buộc phải nắm bắt hoặc mang ngoại lệ cấp thấp hơn trong chữ ký của họ, làm cho mã đơn giản hơn và tập trung hơn vào miền doanh nghiệp.
ngoại lệ Subclass dựa trên cách thức chúng được xử lý chứ không phải là người đã viết chúng ...
Thông thường thời gian chạy ngoại lệ có thể không được xử lý theo cách khác so với đăng nhập lỗi và có thể hiển thị một thông báo lỗi.
ngoại lệ Kiểm tra khả năng có thể có một dự phòng cụ thể, và trong trường hợp đó họ nên probly không phân lớp một "MyFrameWorkException" - như trong trường hợp đó, bắt một MyFrameWorkException sẽ không làm nhiều hơn là đánh bắt chung (đăng nhập, vv)
Thực tiễn khá tồi tệ là phát minh ra toàn bộ các trường hợp ngoại lệ có ít điểm chung, ngoại trừ thực tế là chúng thuộc về một khuôn khổ cụ thể. (gói được cho là sử dụng cho việc đó.)
Nó là hoàn toàn ok để phân lớp RuntimeException (nếu lớp con hiện không phải là một sự phù hợp thần)
Document trường hợp ngoại lệ không được kiểm soát. Hãy thận trọng với các ngoại lệ đã kiểm tra và không xây dựng hệ thống phân cấp.
Theo ý kiến của tôi, bạn chỉ nên tạo Ngoại lệ mới nếu bạn thực sự cần đến chúng, nghĩa là muốn bắt chúng và thực hiện điều trị cụ thể cho chúng. Trên tất cả các trường hợp khác, tôi không thực sự thấy tính hữu dụng.
- 1. Tại sao tôi phải thường xuyên dọn dẹp một dự án cụ thể trong Eclipse?
- 2. Phân nhánh các dự án cụ thể từ một giải pháp đa dự án
- 3. Xcode: Chạy dự án có bản địa hóa cụ thể
- 4. Tại sao global.asax mất tích từ một Website dự án
- 5. Tại sao tăng gấp đôi không chính xác trong một dự án Visual Studio 2008 cụ thể?
- 6. Tại sao không thể đặt một .aidl vào một dự án thư viện?
- 7. Tại sao NetBeans không thể tìm thấy CopyLibs cho một số dự án của tôi?
- 8. Sao chép tệp từ một dự án này sang một dự án khác trong maven
- 9. TFS - Đặt quyền cho dự án cụ thể trong dự án nhóm
- 10. Tại sao trình biên dịch Delphi tạo một tệp có tên 'c' trong khi xây dựng một dự án cụ thể?
- 11. Tại sao có một số thư mục màu xanh trong dự án Xcode của tôi?
- 12. Sao chép các tệp iPhone CoreData từ một dự án sang một dự án khác
- 13. Tai nạn VSHost, REGDB_E_INVALIDVALUE tải Dự án Cụ thể
- 14. Tại sao gửi danh sách cho hợp tác dự án?
- 15. Có thể sử dụng chuỗi công cụ ocamlfind/ocamlbuild với các bản sao gói dự án cục bộ dự án như thế nào?
- 16. Chuyển đổi dự án hiện tại thành dự án maven
- 17. Tôi có thể tạo đoạn mã cụ thể của dự án không?
- 18. khung chơi không thể chạy một dự án hiện có
- 19. Có thể sao chép Mẫu mục công việc từ dự án này sang dự án khác không?
- 20. Tôi có thể sao chép cấu hình gói nuget từ dự án này sang dự án khác không?
- 21. Cách lập trình và biên dịch một dự án C# khác từ dự án hiện tại
- 22. Dự án MonoDroid trong một linh hồn có chứa một dự án điện thoại Windows 7?
- 23. Tạo một POM Maven từ một dự án hiện có?
- 24. Tại sao Tfs2010 xây dựng dự án Wix của tôi trước bất kỳ dự án nào khác?
- 25. Dự án Talend tại SVN
- 26. Nhận tất cả các vấn đề Jira cho một Dự án cụ thể
- 27. Xcode 4. Tại sao dự án đổi tên của tôi không thể tìm thấy tệp Info.plist?
- 28. TFS: Tạo một dự án mới từ dự án hiện có trong TFS
- 29. Làm thế nào tôi có thể tham khảo một dự án từ một dự án khác trong C#?
- 30. Có thể tự động tạo các dự án Xcode không?
Điều này đã gây ra một loạt câu trả lời thú vị, nhưng không có bất kỳ sự đồng thuận rõ ràng nào. Điều này cho thấy rằng câu hỏi này có tính chủ quan cao và không hoàn toàn có thể trả lời được. – erickson
Có, bạn nên. Tôi đã thu thập một số điểm về nó http://jyops.blogspot.in/2012/03/why-should-you-use-unchecked-exceptions.html. – ManuPK