Skip to content

Instantly share code, notes, and snippets.

@kvk1920
Created May 20, 2018 23:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kvk1920/74b39045f32ef57de81c8a05efab5ecd to your computer and use it in GitHub Desktop.
Save kvk1920/74b39045f32ef57de81c8a05efab5ecd to your computer and use it in GitHub Desktop.
/*
В плюсах есть правило: в одно время не могут быть необработанны два исключения.
Тут будет происходить примерно следующее:
Деструтор 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