Ce face std::overflow_error
std::overflow_error (derivată din std::runtime_error) semnalează o depășire: rezultatul unui calcul nu încape în tipul de date. Biblioteca standard o aruncă rar, de exemplu din std::bitset::to_ulong când biții nu încap într-un unsigned long.
Atenție: operațiile aritmetice obișnuite nu aruncă această excepție. Depășirea unui int cu semn este comportament nedefinit, iar la tipurile fără semn rezultatul „se rotește”. Dacă vrei o excepție, verifici tu înainte de calcul și o arunci.
Parametri
| Parametru | Descriere |
|---|---|
mesaj |
Textul erorii. |
Ce returnează
Un obiect excepție.
Exemple
Exemplul 1: Înmulțire verificată
#include <limits>
#include <print>
#include <stdexcept>
int inmulteste(int a, int b) {
if (a != 0 && b > std::numeric_limits<int>::max() / a) {
throw std::overflow_error("rezultatul nu încape într-un int");
}
return a * b;
}
int main() {
try {
std::println("{}", inmulteste(1000, 2000));
std::println("{}", inmulteste(100000, 50000));
} catch (const std::overflow_error& e) {
std::println("Eroare: {}", e.what());
}
}
Rezultat
2000000
Eroare: rezultatul nu încape într-un int
Exemplul 2: bitset::to_ulong
Un bitset de 128 de biți cu bitul 100 setat nu încape în unsigned long (64 de biți). Textul mesajului este cel din libc++.
#include <bitset>
#include <print>
#include <stdexcept>
int main() {
std::bitset<128> biti;
biti.set(100); // un bit care nu încape în 64 de biți
try {
std::println("{}", biti.to_ulong());
} catch (const std::overflow_error& e) {
std::println("overflow_error: {}", e.what());
}
}
Rezultat
overflow_error: __bitset<_N_words, _Size>::to_ulong overflow error
Greșeli frecvente
- Pui
try/catch (std::overflow_error)în jurul unui calcul cuintși te aștepți să prinzi depășirea. Nu se aruncă nimic; verificarea trebuie făcută manual.
Comenzi înrudite
std::runtime_error: Excepție pentru erorile care apar doar la rulare, din cauze externe: fișier lipsă, rețea, date greșite.std::numeric_limits: Dă proprietățile unui tip numeric: valoarea maximă și minimă, precizia, dacă are semn, infinitul.std::in_range: Verifică dacă un număr întreg încape în alt tip întreg, fără capcanele conversiilor cu semn.std::exception: Clasa de bază a tuturor excepțiilor din biblioteca standard; what() returnează mesajul erorii.