У вас что-то не так.Я имею в виду, вы что-то неправильно поняли.
Это не может быть попыткой поймать.'throw' и 'try-catch' являются вещами внутри потока, они живут только в текущем потоке, каким бы он ни был в момент выброса, основным потоком или другим.
Другой поток не может перехватить исключениевыброшенный из текущей темы.Исключения не пересекают потоки, если вы действительно не хотите этого и не реализуете его, как, например, что-то в текущем потоке, перехватывает исключение и передает их другому потоку, а затем повторно выдает / etc эти исключения там.У вас нет таких вещей, поэтому это не может быть.
У вас есть join()
вызов после броска, и вы ожидаете, что throw 1
пропустит его.Это правда.Однако в области видимости также есть переменная std::thread cThread
.
Поскольку поток работает и из-за throw 1
поток еще ни разу не был присоединен (), то ожидается 1015 * завершение программы (см. https://stackoverflow.com/a/13984169/717732),, потому что деструктор из std :: thread будет обнаруживать поток un-join () ed. Это означает, чтоstd::cout << "Catched exception " << e << " in main";
никогда не должен вызываться. Даже если поток каким-то образом завершился, ваша программа все равно должна завершиться, поскольку она не меняет того факта, что она не была join () ed (см. https://en.cppreference.com/w/cpp/thread/thread/joinable)
Однако,в зависимости от библиотеки, компилятора, отладчика и т. д. эффект, который вы видите, может отличаться. Например, если вы запустите его в отладчике, он может подождать, пока все потоки не завершатся, и вы получите эффект «ожидания до завершения внутреннего потока».". Трудно сказать.
Если вы действительно видите, что строка "Catched exception " << e << "
работает, у вас есть реальная проблема. Либо вы запускаете что-то другое, чем ваш текущий код, либо ваш stdlib не работает. Aсломанный stdlib может на экзаменПожалуйста, сделайте тихое соединение () в деструкторе std :: thread вместо завершения программы.Кто знает.Сломанная библиотека может сделать много вещей.