Возможно, некоторые или все модули были скомпилированы с -fno-exceptions
?См. http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_exceptions.html для получения подробной информации о том, как это меняет поведение исключений.
Например, следующая короткая программа отображает "terminate called after throwing an instance of 'std::string'"
, если:
- модуль, который содержит
foo()
был скомпилирован с -fno-exceptions
, а foo()
вызывает что-то, что вызывает исключение типа std::string
(все остальные модули были скомпилированы с -fexceptions
)
#include <string>
#include <iostream>
using namespace std;
int foo();
int main()
{
try {
foo();
}
catch (string& s) {
std::cout << "caught it: \"" << s << "\"" << endl;
}
return 0;
}
Обратите внимание: если я просто перекомпилирую foo.cpp
с параметром -fexceptions (по умолчанию для g ++) и перекомпоновлю, программа отобразит:
caught it: "the string exception"
, как и ожидалось.
Или, возможно, какая-то промежуточная функция имела спецификацию броска, в которой не было указано std::string
?
Например, эта программа:
#include <string>
#include <iostream>
using namespace std;
int Hunc() throw(int); // can only throw int (?)
int main()
{
try {
Hunc();
}
catch (string& s) {
std::cout << "caught it: \"" << s << "\"" << endl;
}
return 0;
}
int Hunc() throw(int)
{
throw string("the string exception");
}
Также отображает «завершение вызова» после броска экземпляра'std :: string' ".Оба примера были протестированы на Windows-коробке с MinGW 4.5.1.