Вы упомянули сторонние функции между источником исключения и try-catch.Если эти сторонние функции не являются c ++ (например, имеют связь c, как libcurl, пишущий на c), тогда обработка исключений не будет работать должным образом.У меня была такая же проблема с проектом, использующим gcc.
Вам нужно перехватить все исключения в ваших обратных вызовах, прежде чем они распространятся через сторонний уровень, и использовать коды ошибок (или пользовательский механизм) для передачи информации в вашвызывающий или отказаться от использования исключений полностью.
Когда вы спрашиваете, что я сделал: у меня был объект контекста от вызывающего, введенный в обратный вызов через доступный указатель void.Поэтому я изменил объект контекста, чтобы иметь члены ErrorStatus и ErrorMessage, и использовал их для распространения ошибок через C-слой.
struct Context{
ErrorCode errorCode;
const char* errorMessage;
//other stuff
}
void callback(T arg, void* context){
try{
new(int);
}catch(std::exception &e){
context.errorCode=getErrorCode(e);
context.errorMessage=e.what();
}
}
void caller(){
Context context;
thirdparty_function(context);
}
Если вы не беспокоитесь о безопасности потоков, вы также можете использовать глобальные переменные для этого.
Тем не менее, обработка ошибок нехватки памяти таким способом может быть сложной, потому что вам следует избегать выделения дополнительной памяти для сообщений об ошибках