Giả sử chúng tôi đang triển khai bộ sưu tập tùy chỉnh hoạt động giống như vectơ và chúng tôi muốn thực hiện operator[]
trừ một số ngoại lệ nếu bộ sưu tập trống. std::vector
có hành vi không xác định trong trường hợp này nhưng chúng tôi muốn ném ngoại lệ. Nếu đây là C#, chúng tôi có thể sẽ ném InvalidOperationException
. Nhưng C++ exception nào là phù hợp nhất/trực quan trong trường hợp này? Tôi cảm thấy std::out_of_range
sẽ không phải là lựa chọn tốt nhất vì bộ sưu tập trống nên không có 'phạm vi' để lập chỉ mục sẽ trả lại phần tử hợp lệ (bất kỳ) nào.Ngoại lệ nào để ném khi trạng thái hiện tại của đối tượng không cho phép thao tác trên đó?
Trả lời
std::vector::at đã thực hiện việc này. Vì vậy, bạn có thể sử dụng phương pháp at
thay vì operator []
. Nó ném std::out_of_range
cho chỉ mục không hợp lệ.
Xin lưu ý rằng bạn sẽ phải thực hiện công việc quan trọng để đạt được hiệu suất của std::vector
. Nhưng vẫn còn nếu bạn muốn dính vào container của riêng bạn và muốn ném từ []
thì giống như phương thức at
std::out_of_range
là lựa chọn tốt nhất trong số các lớp ngoại lệ tiêu chuẩn. Nếu không, bạn cần xác định lớp ngoại lệ tùy chỉnh của riêng bạn.
Cảm ơn @taskinoor. Tôi đã triển khai bộ sưu tập tùy chỉnh này như một bài tập ... nên đây là một câu hỏi giả định hơn. Tôi chắc chắn sẽ tránh làm điều đó trong trường hợp của phần mềm thương mại/sản xuất trừ khi có một lý do rất tốt để làm điều đó. –
@BojanKomazec vì mục đích học tập là hoàn toàn ổn, IMHO. Tắt bình luận chủ đề: xin hãy xem 'std :: allocator' mà bạn có thể cần tránh việc gọi không cần thiết của các nhà xây dựng mặc định và di chuyển ngữ nghĩa mà bạn có thể cần cho hoạt động phát triển hiệu quả. – taskinoor
- 1. Lỗi ASP: Thao tác không hợp lệ do trạng thái hiện tại của đối tượng
- 2. Thao tác không hợp lệ do trạng thái hiện tại của đối tượng
- 3. 'Thao tác không hợp lệ do lỗi hiện tại của đối tượng' khi postback
- 4. Trạng thái con trỏ đối tượng Sau khi phát hiện ra constructor ném ngoại lệ - C++
- 5. Ngoại lệ "Thao tác không hợp lệ đối với trạng thái giao dịch" bằng cách sử dụng TransactionScope
- 6. Mã trạng thái HTTP nào cần trả lại khi thao tác DELETE không được phép vì lý do cụ thể
- 7. Trường hợp ngoại lệ nào để ném khi không cho phép người đặt tài sản?
- 8. Việc ném một ngoại lệ có thay đổi trạng thái của nó không?
- 9. HttpWebRequest.GetResponse() - mã trạng thái cụ thể nào khiến một ngoại lệ bị ném ra?
- 10. Tại sao ngoại lệ thao tác chéo không được ném trong khi chạy exe trong bin \ Debug
- 11. Có ổn không khi thao tác dom trước trạng thái sẵn sàng?
- 12. Có ngoại lệ .NET được cài sẵn cho biết trạng thái đối tượng bất hợp pháp không?
- 13. Trạng thái hiện tại của Meteor cho ứng dụng ngoại tuyến
- 14. Chuỗi thao tác đối tượng
- 15. Tại sao đối tượng được xử lý không ném ngoại lệ khi sử dụng nó sau khi xử lý?
- 16. Trạng thái hiện tại của Mono trên Linux?
- 17. JSON đối tượng thao tác
- 18. Tại sao thao tác TransactionScope không hợp lệ?
- 19. Tại sao bắt ngoại lệ được kiểm tra cho phép đối với mã không loại trừ ngoại lệ?
- 20. Khi nào sử dụng bean phiên trạng thái trên bean phiên không trạng thái?
- 21. Trạng thái WiFi không bật cho phép
- 22. Khi trả lại bool, hãy ném ngoại lệ và ngoại lệ nào để ném
- 23. Strange ngoại lệ ném - gán: Hoạt động không được phép
- 24. Không cho phép bất kỳ thao tác nào
- 25. NSMutableArray removeObjectAtIndex: ném ngoại lệ đối số không hợp lệ
- 26. Hiển thị biểu tượng trên thanh trạng thái khi tác vụ của tôi đang chạy
- 27. Làm thế nào tôi có thể bắt ngoại lệ trạng thái 404 được ném bởi simpleHttp của Http.Conduit
- 28. Khi nào một đối tượng giả nhập vào trạng thái phát lại?
- 29. Lấy trạng thái đối tượng
- 30. Bối rối về khi nào nên ném một ngoại lệ
Thực ra tôi nghĩ 'std :: out_of_range' thực sự sẽ là ngoại lệ mà tôi sẽ sử dụng. Nếu vùng chứa trống, thì bất kỳ chỉ mục nào nằm ngoài phạm vi, giống như cách 'std :: vector' đã hoạt động. Hãy nhớ rằng một tập rỗng vẫn là một tập hợp (theo nghĩa toán học) – CoryKramer
IMHO Tôi nghĩ mọi người sẽ hiểu cách bạn sử dụng 'std :: out_of_range'. Ngay cả trang web tham chiếu bạn liên kết cũng có * Xác định loại đối tượng cần được loại trừ là ngoại lệ. Nó báo cáo lỗi là hậu quả của việc cố gắng truy cập các phần tử ngoài phạm vi được xác định. * Tương thích tốt với tình huống này. – NathanOliver
'vector :: at' sẽ ném' std :: out_of_range' khi vectơ trống, vì vậy tôi tin rằng đó thực sự là ngoại lệ chính xác để sử dụng. – SirDarius