std::out_of_range în C++

Excepție aruncată când un index sau o cheie este în afara limitelor (vector::at, string::substr, map::at).

Sintaxă
#include <stdexcept>
throw std::out_of_range("mesaj");

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ă arunce out_of_range. Doar at() 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.