Бросок копирует полученное значение в определенное место реализации.
Таким образом, значение копируется при броске (это означает, что тип должен быть скопирован).
Когда вы поймаете, вы можете поймать по значению или ссылке.
catch(X val) // Catch by value
{
}
catch(Y& val) // Catch by reference
{
}
Идиоматический подход к улову заключается в том, чтобы поймать ссылку const. Это связано с тем, что если вы поймаете по значению, существует возможность разрезания, когда исключение копируется из его сохраненного местоположения в значение catch. Если вы поймаете по значению, значение будет уничтожено в конце блока catch. Копия в сохраненном месте уничтожается в конце блока try/catch, где она была схвачена (а не повторно выбрана).
Так что, когда вы ловите catch(...)
, ничего не происходит. Исключением остается в неуказанном местоположении, что исключение уже скопировано.
Когда вы используете throw для повторного выброса исключения. throw;
. Опять ничего не происходит, поскольку исключение уже находится в неуказанном месте, и ничего не должно произойти.
Примечание: вызов throw;
, когда распространение исключений является ошибкой, приведет к вызову std :: terminate.
Если один пишет 'поймать (...) {бросить; } ', то как бы это свергнуть, по значению или по ссылке? Обратите внимание, что в этом случае не обнаружен исходный объект. – Nawaz
По значению или по ссылке? – Nawaz
Я особенно нахожу смелую часть, запутанную с помощью 'catch (...)': * «Rethrowing with throw; бросает исходный объект **, если исходное исключение было поймано по ссылке ** или если вызвано внутри catch-all и копия **, если исключение было поймано по значению **. "* – Nawaz