Sobes.tech
Middle+

Mi történik, ha egy noexcept-ként megjelölt függvényben kivétel keletkezik?

sobes.tech MI

Válasz az MI-től

A program azonnal befejeződik a std::terminate() hívásával. Ez a viselkedés a C++ szabvány szerint azokra az esetekre vonatkozik, amikor kivételek lépnek ki a noexcept-ként deklarált függvényből.

A témához kapcsolódó C++ szabvány szakaszai:

  • [except.spec] noexcept specifikáció.
  • [except.terminate] Kezelés a std::terminate() hívásával.

Példa:

#include <iostream>
#include <stdexcept>
#include <cstdlib> // A `std::terminate`-hez

void f() noexcept {
    throw std::runtime_error("Hiba történt a noexcept függvényben");
}

int main() {
    try {
        f();
    } catch (...) {
        // Ez a catch blokk nem fog elérni
        std::cerr << "Kivétel elfogva" << std::endl;
    }

    // Ha f() kivételt dob, a `std::terminate()` a fenti pont előtt lesz meghívva
    std::cout << "A program folytatódik (nem fog megjelenni)" << std::endl;

    return 0;
}

A program kimenete tartalmazni fog egy üzenetet a std::terminate() kezelőtől, amely a megvalósítástól függően változhat, de általában tartalmazza a befejezés okát.

tterminate called after throwing an instance of 'std::runtime_error'
  what():  Hiba történt a noexcept függvényben