Sobes.tech
Middle+

Co się stanie, jeśli w funkcji oznaczonej jako noexcept wystąpi wyjątek?

sobes.tech AI

Odpowiedź od AI

Program zostanie natychmiast zakończony przez wywołanie std::terminate(). Jest to standardowe zachowanie określone w C++ dla obsługi wyjątków wykraczających poza zakres funkcji zadeklarowanej jako noexcept.

Oto odpowiednie sekcje standardu C++:

  • [except.spec] Specyfikacja noexcept.
  • [except.terminate] Obsługa przez wywołanie std::terminate().

Przykład:

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

void f() noexcept {
    throw std::runtime_error("Wystąpił błąd w funkcji noexcept");
}

int main() {
    try {
        f();
    } catch (...) {
        // Ten blok catch nie zostanie osiągnięty
        std::cerr << "Przechwycono wyjątek" << std::endl;
    }

    // Jeśli f() rzuci wyjątkiem, std::terminate() zostanie wywołane przed tym punktem
    std::cout << "Program kontynuuje działanie (nie będzie wyświetlone)" << std::endl;

    return 0;
}

Wyjście tego programu będzie zawierało komunikat obsługi std::terminate(), który może zależeć od implementacji, ale zazwyczaj zawiera informacje o przyczynie zakończenia.

terminate called after throwing an instance of 'std::runtime_error'
  what():  Wystąpił błąd w funkcji noexcept