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