std::invalid_argument în C++

Excepție pentru un argument cu valoare nepermisă, de exemplu text care nu este număr la std::stoi.

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

Ce face std::invalid_argument

std::invalid_argument (derivată din std::logic_error) înseamnă că o funcție a primit o valoare pe care nu o poate folosi. Biblioteca standard o aruncă, de exemplu, din std::stoi/std::stod când textul nu începe cu un număr și din constructorul std::bitset când șirul conține alte caractere decât 0 și 1.

Este alegerea potrivită și pentru validarea parametrilor în funcțiile tale (un e-mail fără @, o vârstă negativă).

Parametri

Parametru Descriere
mesaj Textul erorii.

Ce returnează

Un obiect excepție.

Exemple

Exemplul 1: Conversia unui text în număr

std::stoi aruncă invalid_argument pentru text fără cifre la început și out_of_range pentru numere prea mari.

#include <print>
#include <stdexcept>
#include <string>

int main() {
    for (std::string text : {"42", "patru", "99999999999"}) {
        try {
            std::println("{} -> {}", text, std::stoi(text));
        } catch (const std::invalid_argument& e) {
            std::println("{} -> invalid_argument ({})", text, e.what());
        } catch (const std::out_of_range& e) {
            std::println("{} -> out_of_range ({})", text, e.what());
        }
    }
}

Rezultat

42 -> 42
patru -> invalid_argument (stoi: no conversion)
99999999999 -> out_of_range (stoi: out of range)

Exemplul 2: Validarea parametrilor

#include <print>
#include <stdexcept>
#include <string>

std::string domeniu(const std::string& email) {
    auto poz = email.find('@');
    if (poz == std::string::npos) {
        throw std::invalid_argument("Adresa '" + email + "' nu conține @");
    }
    return email.substr(poz + 1);
}

int main() {
    try {
        std::println("{}", domeniu("ana@dexblog.ro"));
        std::println("{}", domeniu("ana.dexblog.ro"));
    } catch (const std::invalid_argument& e) {
        std::println("Eroare: {}", e.what());
    }
}

Rezultat

dexblog.ro
Eroare: Adresa 'ana.dexblog.ro' nu conține @

Greșeli frecvente

  • Crezi că std::stoi("12abc") aruncă. Nu aruncă: citește cât poate (12) și se oprește. Pentru validare completă, folosește al doilea parametru (pos) sau std::from_chars și verifică dacă s-a consumat tot textul.

Comenzi înrudite

  • std::stoi: Transformă un text în număr întreg (int, long, long long, unsigned long), cu excepții la erori.
  • std::logic_error: Excepție pentru greșeli de logică ce puteau fi evitate prin cod corect; domain_error: valoare în afara domeniului.
  • std::out_of_range: Excepție aruncată când un index sau o cheie este în afara limitelor (vector::at, string::substr, map::at).
  • std::exception: Clasa de bază a tuturor excepțiilor din biblioteca standard; what() returnează mesajul erorii.