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) saustd::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.