Вы наблюдаете, что std::terminate
вызывается, даже если у вас есть try
/ catch
, который, как вы ожидаете, соответствует исключению, которое выдается.
Одна из причин, по которой это может произойти, -Вам удалось создать исключение, пока обрабатывается предыдущее исключение.Вы можете наблюдать это с помощью:
#include <iostream>
int main() {
try {
struct test {
~test() { throw 0; }
} test;
throw 0;
}
catch (...) {
std::cout << "Caught something" << std::endl;
}
}
В моей системе это вызывает abort()
и выводит:
прекращение вызова после броска экземпляра 'int'
Обратите внимание, что catch(...)
никогда не попадет из-за этого.
Этот простой пример иллюстрирует самый простой способ случайно сделать это - бросок из деструктора .Мое лучшее предположение из того, что вы показали, что это то, что происходит.Отладчик должен подтвердить это для вас.