Возможно, что функция, вызванная монитором прямо или косвенно constructor
, нарушает спецификацию исключений и не позволяет выбрасывать std::bad_exception
. Если вы не заменили стандартную функцию для захвата этого, то это объяснило бы поведение, которое вы видите.
Чтобы проверить эту гипотезу, вы можете попытаться определить свой собственный обработчик:
void my_unexpected()
{
std::cerr << "Bad things have happened!\n";
std::terminate();
}
bool PyMonitor::connect() {
std::set_unexpected( my_unexpected );
try {
_monitor = new Monitor(_host, _calibration);
} catch (...) {
printf("oops!\n");
}
}
Если вы получаете "Плохие вещи произошли!" сообщение об ошибке, то вы подтвердили, что это так, но, к сожалению, не так много, что вы можете сделать. Если вам «повезло», вы можете создать исключение из my_unexpected
, которое разрешено спецификацией исключений для функции, которая в данный момент не работает, но в любом случае ваш неожиданный обработчик не может нормально завершиться. Он должен бросить или иным образом прекратить.
Чтобы исправить это, вам действительно нужно войти в вызываемый код и либо исправить его, чтобы спецификация исключений не нарушалась, либо путем исправления самой спецификации, либо путем исправления кода, чтобы он не генерировал исключение, которое не не ожидал.
Другая возможность заключается в том, что во время разматывания стека создается исключение, вызванное исходным исключением. Это также может привести к прекращению процесса. В этом случае, хотя вы можете заменить стандартную функцию завершения, у вас нет выбора, кроме как прервать программу. Обработчику завершения запрещается выбрасывать или возвращать, он должен завершать программу.