Sobes.tech
Middle+

Kas nutiks, jei funkcijoje, pažymėtoje kaip noexcept, įvyks išimtis?

sobes.tech AI

Atsakymas iš AI

Programa iš karto bus baigtas iškvietus std::terminate(). Tai yra standartinis elgesys, apibrėžtas C++ kalboje, norint tvarkyti išimtis, kurios išlenda už funkcijos, paskelbtos kaip noexcept, ribų.

Susijusios C++ standarto dalys:

  • [except.spec] noexcept specifikacija.
  • [except.terminate] Tvarkymas iškviečiant std::terminate().

Pavyzdys:

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

void f() noexcept {
    throw std::runtime_error("Įvyko klaida noexcept funkcijoje");
}

int main() {
    try {
        f();
    } catch (...) {
        // Šis catch blokas nebus pasiektas
        std::cerr << "Išimtis sugauta" << std::endl;
    }

    // Jei f() išmes išimtį, `std::terminate()` bus iškviesta prieš šią eilutę
    std::cout << "Programa tęsiasi (nebus parodyta)" << std::endl;

    return 0;
}

Šios programos išvestis turės std::terminate() apdorotojo pranešimą, kuris gali priklausyti nuo įgyvendinimo, bet paprastai apima informaciją apie užbaigimo priežastį.

tterminate called after throwing an instance of 'std::runtime_error'
  what():  Įvyko klaida noexcept funkcijoje