Rzut powoduje skopiowanie wyrzuconej wartości do zdefiniowanej lokalizacji.
Tak więc wartość jest kopiowana przy rzucie (co oznacza, że typ musi być kopiowalny).
Po złapaniu można wybrać odłowu według wartości lub odniesienia.
catch(X val) // Catch by value
{
}
catch(Y& val) // Catch by reference
{
}
Idiomatycznym powodem, dla którego należy złapać, jest złapanie przez odniesienie do stałej. Dzieje się tak dlatego, że jeśli złapiesz wartość, istnieje możliwość ukrojenia, gdy wyjątek zostanie skopiowany z zapisanej lokalizacji do wartości catch. Jeśli złapiesz wartość, wartość zostanie zniszczona na końcu bloku catch. Kopia w zapisanej lokalizacji zostanie zniszczona na końcu bloku try/catch, w którym została przechwycona (i nie jest ponownie zgłaszana).
Po złapaniu z catch(...)
nic się nie dzieje. Wyjątek pozostaje w nieokreślonej lokalizacji, do której wyjątek został już skopiowany.
Gdy używasz rzutowania, aby ponownie rzucić wyjątek. throw;
. Znowu nic się nie dzieje, ponieważ wyjątek znajduje się już w nieokreślonej lokalizacji i nic nie musi się wydarzyć.
Uwaga: wywołanie throw;
, gdy nie rozprzestrzenia się żaden wyjątek, jest błędem i spowoduje wywołanie polecenia std :: endate.
Jeśli ktoś pisze 'catch (...) {throw; } ', a następnie w jaki sposób zostałby ponownie rzucony, przez wartość lub przez odniesienie? Zwróć uwagę, że w tym przypadku nie jest przechwytywany oryginalny obiekt. – Nawaz
Według wartości lub przez odniesienie? – Nawaz
Szczególnie odważna część jest myląca z 'catch (...)': * "Rethrowing with throw, wyrzuca oryginalny obiekt ** jeśli oryginalny wyjątek został złapany przez odniesienie ** lub jeśli został wywołany w catch-all, i kopię **, jeśli wyjątek został przechwycony przez wartość **. "* – Nawaz