Будет ли main() ловить исключения из потоков?

У меня есть довольно большое приложение, которое динамически загружает общие объекты и выполняет код в общем объекте. В качестве меры предосторожности, я поставил try/catch почти все в main. Я создал уловку для 3 вещей: myException (исключение из дома), std::exception и ....

Как часть выполнения общих объектов, создается много pthreads. Когда поток генерирует исключение, он не попадает под main. Это стандартное поведение? Как я могу поймать все исключения, независимо от того, из какого потока они выбрасываются?

Ответ 1

Будет ли main() перехватывать исключения, отбрасываемые из потоков?

Нет

Когда поток генерирует исключение, он не попадает на главную. Это стандартное поведение?

Да, это стандартное поведение.

Чтобы поймать исключение, происходящее из потока X, вы должны иметь предложение try - catch в потоке X (например, вокруг всего в функции потока, аналогично тому, что вы уже делаете в main).

По поводу связанного вопроса см. Как распространять исключения между потоками?

Ответ 2

В вашем вопросе возникает вопрос о том, что концептуально невозможно.

Попытки блоков определяются как динамические конструкции стека. Блок try ловит исключения, генерируемые кодом, которые динамически, по вызову, получают из его содержимого.

Когда вы создаете новый поток, вы создаете совершенно новый стек, который вовсе не является частью динамического контекста блока try, даже если вызов pthread_create находится внутри try.

Ответ 3

Нет, main не будет перехватывать исключения из других потоков. Вам нужно будет использовать нестандартное, платформенное средство, которое обращается к необработанным исключениям, чтобы агрегировать обработку так, как вы описываете.

Когда я создаю такие приложения, я убеждаюсь, что каждый активный объект имеет свой собственный блок обработки исключений верхнего уровня, чтобы предотвратить полное взламывание всего приложения, если один поток терпит неудачу. Использование уловов, зависящих от платформы, все, что я думаю, требует от вашего общего кода/решения быть неаккуратным. Я бы не использовал такую ​​вещь.

Ответ 4

Считайте, что бросание исключения разворачивает стек. Каждый поток имеет свой собственный стек. Вам нужно будет разместить блок try/catch в каждой функции потока (т.е. В точке входа для каждого потока).