Не обязательно даже безопасно использовать исключения через границы модулей, скомпилированных с помощью разных версий одного и того же набора инструментов.
Например, ваш тип исключения может иметь член std :: string, но std: : string может быть реализован по-разному от одной стандартной версии библиотеки к другой. Если ваш библиотечный модуль был скомпилирован со старым набором инструментов, а клиентская программа - с более новой версией, исключение будет заполнено объектами, соответствующими старой реализации, но программа затем попытается получить к нему доступ, как если бы это была новая реализация.
Честно говоря, это верно почти для всех типов C ++, не относящихся к POD, а не только для исключений. Можно использовать объекты C ++ вне границ библиотеки, но, как правило, только при условии, что весь код скомпилирован и компонован с использованием тех же инструментов и стандартных библиотек. Вот почему, например, есть бинарные файлы boost для всех основных версий MSV C.
Я полагаю, вам удастся избежать выброса типа исключения POD, который не является производным от std :: exception, но это было бы очень ограничено (например, потребовалось бы поймать точный тип).