Ce face std::out_of_range
Biblioteca standard aruncă std::out_of_range din metodele cu verificare: vector::at, string::at, string::substr (poziție de start prea mare), map::at (cheie inexistentă), std::stoi (număr prea mare pentru tip).
Operatorul [] nu verifică nimic și nu aruncă: un index greșit este comportament nedefinit. De aceea, când indexul vine din afară, folosește at() și prinde std::out_of_range.
Parametri
| Parametru | Descriere |
|---|---|
mesaj |
Textul erorii (când o arunci tu). |
Ce returnează
Un obiect excepție.
Exemple
Exemplul 1: at(), substr() și map::at
Mesajele sunt cele din libc++ și pot diferi la alte compilatoare.
#include <map>
#include <print>
#include <stdexcept>
#include <string>
#include <vector>
int main() {
std::vector<int> note{9, 10};
std::string oras = "Iași";
std::map<std::string, int> stoc{{"mere", 12}};
try { std::println("{}", note.at(5)); }
catch (const std::out_of_range& e) { std::println("vector: {}", e.what()); }
try { std::println("{}", oras.substr(10)); }
catch (const std::out_of_range& e) { std::println("string: {}", e.what()); }
try { std::println("{}", stoc.at("pere")); }
catch (const std::out_of_range& e) { std::println("map: {}", e.what()); }
}
Rezultat
vector: vector
string: basic_string
map: map::at: key not found
Exemplul 2: Aruncată de codul tău
#include <array>
#include <print>
#include <stdexcept>
#include <string>
std::string numeLuna(int luna) {
static const std::array<std::string, 12> luni{"ianuarie", "februarie", "martie", "aprilie",
"mai", "iunie", "iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie"};
if (luna < 1 || luna > 12) {
throw std::out_of_range("Luna " + std::to_string(luna) + " nu există");
}
return luni[static_cast<std::size_t>(luna - 1)];
}
int main() {
try {
std::println("{}", numeLuna(3));
std::println("{}", numeLuna(13));
} catch (const std::out_of_range& e) {
std::println("Eroare: {}", e.what());
}
}
Rezultat
martie
Eroare: Luna 13 nu există
Greșeli frecvente
- Te aștepți ca
v[10]să arunceout_of_range. Doarat()verifică;[]în afara limitelor este comportament nedefinit (poate citi gunoi sau opri programul).
Comenzi înrudite
std::logic_error: Excepție pentru greșeli de logică ce puteau fi evitate prin cod corect; domain_error: valoare în afara domeniului.std::invalid_argument: Excepție pentru un argument cu valoare nepermisă, de exemplu text care nu este număr la std::stoi.std::vector::at: Returnează elementul de la o poziție, cu verificare: aruncă std::out_of_range dacă poziția nu există.std::map::at: Returnează valoarea unei chei existente; aruncă std::out_of_range dacă cheia nu există, fără să o adauge.std::exception: Clasa de bază a tuturor excepțiilor din biblioteca standard; what() returnează mesajul erorii.