Будет ли main () отлавливать исключения, выбрасываемые из потоков? - PullRequest
31 голосов
/ 11 октября 2011

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

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

Ответы [ 4 ]

39 голосов
/ 11 октября 2011

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

Нет

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

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

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

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

17 голосов
/ 11 октября 2011

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

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

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

9 голосов
/ 11 октября 2011

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

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

7 голосов
/ 11 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...