Załóżmy, że implementujemy niestandardową kolekcję, która zachowuje się jak wektor i chcemy, aby operator[]
rzucił wyjątek, jeśli kolekcja jest pusta. std::vector
ma niezdefiniowane zachowanie w tym przypadku, ale chcemy rzucić wyjątek. Jeśli byłby to C#, prawdopodobnie wyrzucilibyśmy InvalidOperationException
. Ale który z nich byłby najbardziej odpowiedni/intuicyjny w tym przypadku? Czuję, że std::out_of_range
nie byłby najlepszym wyborem, ponieważ kolekcja jest pusta, więc nie ma "zakresu", dla którego indeksowanie zwróci ważny (dowolny element).Który wyjątek do rzucania, gdy obecny stan obiektu nie pozwala na próbę operacji na nim?
Odpowiedz
std::vector::at już to robi. Więc możesz użyć metody at
zamiast operator []
. Rzuca std::out_of_range
dla nieprawidłowego indeksu.
Należy pamiętać, że aby uzyskać wydajność std::vector
, należy wykonać znaczne prace. Ale nadal, jeśli chcesz trzymać się swojego własnego pojemnika i chcesz rzucić od []
, to taki sposób jak at
jest najlepszym wyborem spośród standardowych klas wyjątków. W przeciwnym razie musisz zdefiniować własną niestandardową klasę wyjątków.
Dzięki @taskinoor. Wdrażam tę niestandardową kolekcję jako ćwiczenie ... więc było to bardziej hipotetyczne pytanie. Zdecydowanie uniknęłbym tego w przypadku oprogramowania komercyjnego/produkcyjnego, chyba że miałby ku temu dobry powód. –
@BojanKomazec do celów edukacyjnych jest całkowicie w porządku, IMHO. Off topic comment: spójrz na 'std :: allocator', którego możesz potrzebować, aby uniknąć niepotrzebnego wywoływania domyślnych konstruktorów i przenieść semantykę, która może być potrzebna do efektywnego wzrostu operacji. – taskinoor
- 1. Jaki wyjątek do rzucania na nieprawidłowy stan obiektu?
- 2. Zgłaszanie rzucania wyjątku bez rzucania nim
- 3. Który wyjątek do rzucania, gdy długości sekwencji nie są takie same
- 4. LinqToSql błędzie: Operacja nie jest ważne ze względu na obecny stan obiektu
- 5. Jaki jest obecny stan obsługi "thread_local" na platformach?
- 6. Jaki jest obecny stan GWT?
- 7. Jak rzucić wyjątek, gdy podpis metody nie pozwala na wyrzucenie wyjątku?
- 8. Jak zarządzać stanem na komponencie React, który może zmienić stan z elementu nadrzędnego lub zdarzenia na nim?
- 9. Wykryj koniec rzucania na ScrollView
- 10. Uruchom kod na wątku UI bez obiektu kontrolnego obecny
- 11. Wymuszenie rzucania wyjątku, gdy właściwość źródłowa nie jest mapowana
- 12. Web Search API, który pozwala na automatyczne zapytania
- 13. Jak przechwycić argument wysłany na próbę?
- 14. Odpowiedni wyjątek do rzucania w przypadku wystąpienia błędu analizy składniowej?
- 15. Nieprawidłowy wyjątek operacji
- 16. Stan lokalizacji na iOS Facebook
- 17. Pytania dotyczące operacji na NaN
- 18. Konstruktor Webservice C# nie pozwala na argumenty?
- 19. Jak emitować sygnał z QPushButton, gdy mysz na nim wisi?
- 20. Czy polecenie assert w java java pozwala na określenie wiadomości?
- 21. Jak czekać na element obecny?
- 22. Wstrzyknięcie zależne z unique_ptr na próbę
- 23. Dlaczego błędy rzucania C# rzucają podczas prób wykonywania operacji matematycznych na typach całkowitych innych niż int?
- 24. Dlaczego JavaScript nie pozwala na przypisanie właściwości "nazwa" do funkcji?
- 25. Jak mogę (najlepiej) przekonwertować opcję na próbę?
- 26. NAMESPACE_ERR: Podjęto próbę utworzenia lub zmiany obiektu w sposób, który jest błędne w odniesieniu do nazw
- 27. Jaki jest obecny stan GHC w 64-bitowym systemie Windows?
- 28. Regex do dopasowania, gdy łańcuch jest obecny dwukrotnie
- 29. Podany klucz nie był obecny w słowniku. Który klucz?
- 30. @throws Scala nie pozwala na wywołanie Java złapać właściwy wyjątek typu
Właściwie myślę, że 'std :: out_of_range' byłby rzeczywiście wyjątkiem, którego bym użył. Jeśli kontener jest pusty, oznacza to, że indeks jest poza zakresem, tak samo zachowuje się już polecenie "std :: vector". Pamiętaj, że pusty zestaw nadal jest zbiorem (w sensie matematycznym). – CoryKramer
IMHO Myślę, że każdy zrozumie twoje użycie 'std :: out_of_range'. Nawet odnośnik do strony, do której się łączysz * Definiuje typ obiektu, który ma być zgłoszony jako wyjątek. Zgłasza błędy będące konsekwencją próby dostępu do elementów poza zdefiniowanym zakresem. * Co całkiem dobrze pasuje do tej sytuacji. – NathanOliver
'Wektor :: at' rzuci' std :: out_of_range', gdy wektor jest pusty, więc uważam, że jest to rzeczywiście poprawny wyjątek. – SirDarius