Читаю статью по исключениям и решил скопировать код оттуда. Вот код:
int main(int argc, char* argv[]){
try {
throw;
}
catch (...) {
cout << "exception\n";
return 1;
}
cout << "No exeption\n";
return 0;
}
В статье написано что блок catch должен поймать его, но этого не происходит. Почему? Использую msvs 2017. И ещё,
int main(int argc, char* argv[]){
int x = 0;
try {
cout << 2 / x;
}
catch (...) {
cout << "exception\n";
return 1;
}
Тут тоже не ловится исключение типа "Деление на 0". Почему?
Да, есть такой вариант.
Оператор throw без параметров может использовать только во время обработки уже пойманного исключения. В остальных случаях попытка выполнения оператора throw без параметра приведет к немедленному вызову std::terminate.
http://eel.is/c++draft/expr.throw#4
4 If no exception is presently being handled, evaluating a throw-expression with no operand calls std::terminate().
Обратите внимание: "во время обработки уже пойманного исключения" - это характеристика времени выполнения. То есть такой throw не обязан явно синтаксически располагаться на территории try-блока. Такой throw только должен выполняться во время, когда какой-то try-блок активен.
В языке С++ нет никакого исключения "деление на 0". Деление на 0 приводит к неопределенному поведению, а не к выбросу исключения. Исключения в С++ выбрасываются либо явно, при помощи throw, либо неявно изнутри конструкций языка и стандартной библиотеки в специально оговоренных случаях. Деление на 0 таким случаем не является.
throw без параметров действительно может быть использован. Он предназначен для того, чтобы перебросить исключение в вышестоящий try-catch блок.
void foo()
{
throw 10;
}
void buz()
{
try
{
foo();
}
catch(...)
{
std::cout << "exception in buz()\n";
throw;
}
}
int main()
{
try
{
buz();
}
catch(int er)
{
std::cout << "exception in main: " << er << "\n";
}
return 0;
}
Если на момент использования throw; ни одно исключение не обрабатывается (не является активным), тогда такое выражение будет вызывать std::terminate.
Посмотреть
throw
С сайта cplusplus.com:
It is also possible to nest try-catch blocks within more external try blocks. In these cases, we have the possibility that an internal catch block forwards the exception to its external level. This is done with the expression throw; with no arguments. For example:
try {
try {
// code here
}
catch (int n) {
throw;
}
}
catch (...) {
cout << "Exception occurred";
}
Т.к. сообщество рускоязычное, суть примерно такая:
Также возможно вложить try-catch блоки внутрь других внешних блоков. В этих случаях внутренний catch-блок может перенаправить исключение внешнему. Это достигается при помощи выражения throw; без аргументов.
Это подтверждает то, что сказал AR Hovsepyan в комментарии под вопросом:
Но у вас не брошено нигде исключение, а попытка бросить его заново
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости