własny terminate() C++

0

Cześć :)
Rozważmy taką sytuację:
Jakaś funkcja rzuca wyjątek. Następnie odbywa się poszukiwanie catcha, który obsłuży nasz wyjątek. Odbywa się to tak:

  1. Jeżeli znaleziono catch'a odpowiedniego- oddaje mu się sterowanie, a potem jeżeli obsłua nie przerywa programu wykonywany jest kod po catchu.
  2. Jeżeli nie znaleziono catch, funkcja zostaje zwijana ( a konkretnie ramka na stosie) , przeszukiwana kolejna funkcja. W końcu dochodzimy do funkcji main(). Jeżeli tam nie ma obsługi program zostaje zakończony. W tym celu wywoływana jest specjalna funkcja- coś w rodzaju terminate(), czy mogę sam zdefiniować taką funkcję tak, żeby była ona wywoływana?
    Jak to wygląda pod gcc/clang
0

ok, a taki kod dostaje aborted:

#include <exception>
#include <stdexcept>
#include <iostream>

using namespace std;

int main()
{
	set_terminate([]{throw runtime_error("");});
	throw runtime_error("oops");
}

Chciałbym wiedzieć jak zachowuje się kod? Dlaczego jest aborted? Może stack overflow? W ogóle jak ten kod się będzie wykonywał?

3

To jest UB.

N3797, §18.8.3.1 [terminate.handler] /2 napisał(a)

Required behavior: A terminate_handler shall terminate execution of the program without returning to the caller.

0

ok, niezdefiniowane zachowanie. W takim razie jak mogę dowiedzieć się co się dzieje w praktyce?
Wiem, że dochodzi jednak do zabicia, ale na jakiej drodze?

P.S. Gdzie mogę znaleźć takie coś, jak cytujesz? :)

1

N3797 (C++14) http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf
N3337 (C++11) http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
Przy czym nie wiem, czy jest to lektura, którą bym polecał początkującym. A właściwie to wiem: nie polecam.

W praktyce? Możliwe, że wyjątek wywołuje kolejne wywołanie terminate i tak w kółko do wyczerpania zasobów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1