Sobes.tech
Middle+

Mis juhtub, kui noexcept märgitud funktsioonis tekib erand?

sobes.tech AI

Vastus AI-lt

Programm lõpeb koheselt, kutsudes std::terminate(). See on standardkäitumine, mis on määratletud C++-s nende erandite jaoks, mis väljuvad noexcept-ga deklareeritud funktsiooni piiridest.

Selle kohta kehtivad C++ standardi vastavad jaotised:

  • [except.spec] noexcept spetsifikatsioon.
  • [except.terminate] Töötlemine, kutsudes std::terminate().

Näide:

#include <iostream>
#include <stdexcept>
#include <cstdlib> // `std::terminate` jaoks

void f() noexcept {
    throw std::runtime_error("Viga juhtus `noexcept`-i funktsioonis");
}

int peamine() {
    try {
        f();
    } catch (...) {
        // See catch-blokk ei jõua kunagi
        std::cerr << "Erand haaratud" << std::endl;
    }

    // Kui f() viskab erandi, kutsutakse `std::terminate()` enne seda rida
    std::cout << "Programm jätkub (ei kuvata)" << std::endl;

    return 0;
}

Selle programmi väljund sisaldab std::terminate() töötleja sõnumit, mis võib sõltuda rakendusest, kuid tavaliselt sisaldab teavet lõpetamise põhjuse kohta.

tterminate called after throwing an instance of 'std::runtime_error'
  what():  `noexcept`-i funktsioonis toimus viga