Как утверждают другие, boost :: exception - хорошая опция. Однако, как и все опции, которые используют подход общего базового класса, они полагаются на все сгенерированные исключения, производные от этого базового класса. Если вашим промежуточным обработчикам уловов необходимо добавить информацию об исключении из сторонней библиотеки, это не сработает.
Опциональным вариантом может быть использование промежуточных обработчиков перехвата, подобных этому:
catch (std::exception& ex)
{
std::string msg = ex.what();
msg.append(" - my extra info");
ex = std::exception(msg.c_str()); // slicing assignment
throw; // re-throws 'ex', preserving it's original type
}
Это работает только для реализаций std :: exception, которые предоставляют конструктор, принимающий строковый параметр (например, VC ++). Конструктор std :: exception, принимающий строку, является нестандартным расширением.