pthread_exit
może wyjątek, ___forced_unwind, które są wykorzystywane do odwijania stosu podczas zjazdu gwintu. Nie dziedziczy po std::exception
i dlatego nie może zostać przechwycony jako jeden. Jeśli nie złapać ten wyjątek, należy go ponownie throw
dzięki czemu może wykonywać swoje zadania:
try {
...
} catch (abi::___forced_unwind&) {
throw;
} catch (...) {
// whatever
}
Powodem jest wyjątek jest to, że nigdy nie jest określony pthread_exit
powrotu. Mając ten rzut, gwarantuje wyczyszczenie zmiennych przydzielonych do stosu i brak wykonania kodu po jego lokalizacji (chyba że zauważysz wyjątek odwijania ...).
BTW, to kolejny przypadek, w którym idiom catch (...)
przynosi więcej szkód niż pożytku. Czasami jest używany do "stabilizacji" kodu, który rzuca nieznane wyjątki. Ale to tylko ogranicza widoczność uszkodzeń w późniejszym czasie i miejscu, uniemożliwiając identyfikację prawdziwego pochodzenia problemu. Jedyną rozsądną rzeczą do zrobienia w takim haczyku jest minimalne oczyszczanie, możliwie rejestrowanie, a następnie ponowne rzucanie. Proces, który zawiesza się z powodu nieobsługiwanego wyjątku, nie jest pięknym widokiem, ale może dostarczyć debugowalny zrzut awaryjny, który wyraźnie pokazuje błędne polecenie. Ale to tylko moja uraza do catch (...)
, która jest ledwo powiązana z pthread_exit
...
Jakiego kompilatora widzisz? –
@Fabio Może jakiś destruktor obiektu na stosie rzuca. –
@DaveS g ++ TorstenRobitzki dziękuję, choć to samo, ale sprawa została wyjaśniona przez erana –