pthread_exit
potrebbe un'eccezione ___forced_unwind, che viene utilizzato per lo svolgimento pila durante l'uscita del filo. Non eredita da std::exception
e pertanto non può essere catturato come uno. Se lo fai prendere tale eccezione, essere sicuri di ri- throw
in modo che possa fare il suo lavoro:
try {
...
} catch (abi::___forced_unwind&) {
throw;
} catch (...) {
// whatever
}
Il motivo viene generata un'eccezione è che pthread_exit
è specificato non tornare mai più. Avendolo lanciato garantisce la pulizia delle variabili allocate nello stack e nessuna esecuzione del codice dopo la sua posizione (a meno che non si rilevi l'eccezione di svolgimento ...).
BTW, questo è un altro caso in cui l'idioma catch (...)
fa più male che bene. A volte è usato per "stabilizzare" il codice che sta generando eccezioni sconosciute. Ma ciò rimuove la visibilità del danno solo in un secondo momento e luogo, rendendo impossibile identificare la vera origine del problema. L'unica cosa ragionevole da fare in questo tipo di cattura sono le pulizie minime, possibilmente il logging e poi il riavvolgimento. Un processo che si arresta in modo anomalo a causa di un'eccezione non gestita non è una bella vista, ma può fornire un dump di arresto anomalo debugabile che mostra chiaramente il comando errato. Ma questo è solo il mio rancore contro catch (...)
, che è a malapena collegato a pthread_exit
...
Che compilatore vedi sotto? –
@Fabio Forse un distruttore di un oggetto sulla pila viene lanciato. –
@DaveS g ++ TorstenRobitzki grazie, ho pensato lo stesso, ma il caso era quello spiegato da eran –