std::overflow_error în C++

Excepție pentru un rezultat prea mare ca să încapă în tipul folosit (depășire aritmetică).

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

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 cu int ș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.