Created
May 20, 2018 23:06
-
-
Save kvk1920/74b39045f32ef57de81c8a05efab5ecd to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
В плюсах есть правило: в одно время не могут быть необработанны два исключения. | |
Тут будет происходить примерно следующее: | |
Деструтор class B будет кидать исключение. | |
В классе А будет поле В. | |
Функция f() создаст объект А и бросит исключение. | |
Исключение приведёт к вызову деструктора А, тот в свою очередь вызовет ~B(), а тот бросит ещё одно исключение. | |
И получим 2 необработанных исключениея одновременно, что приведёт к ваврийному завершению программы. | |
*/ | |
using namespace std; | |
struct B { | |
~B() { | |
throw 0; | |
} | |
}; | |
struct A { | |
B x; | |
}; | |
int f() | |
{ | |
A a; | |
} | |
int main() | |
{ | |
try { f(); } catch(...) { | |
cout << '-'; | |
} | |
} | |
/* | |
Мораль такая: надо уметь как-то понимать, есть ли с е й ч а с активное исключение. | |
bool std::uncaught_exception() как раз говорит нам это. */ | |
using namespace std; | |
struct B { | |
~B() { | |
if (!uncought_exception()) | |
throw 0; | |
} | |
}; | |
struct A { | |
B x; | |
}; | |
int f() | |
{ | |
A a; | |
} | |
int main() | |
{ | |
try { f(); } catch(...) { | |
cout << '-'; | |
} | |
} | |
// Этот код уже отработает нормально. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment