С Iibjson попробуй, catch не работает, в целевой Cross скомпилированной плате linux

У меня есть попытка поймать внутри конструктора в классе C ++

class jsonAdap
{
jsonAdap(const char *text)
{
try
{
parsejson(text);//this calls a libjson function that throws the expection throw std::invalid_argument("exception")
}
catch(std::invalid_argument)
{
cout<<"Exception captured:"<<endl"}

}
}

Когда я создаю объект этого класса, он выдает ошибку и останавливает завершение вызова после вызова экземпляра ‘std :: invalid_argument’.

это имеет место с кросс-компиляцией на ARM (с -O0 -g3 -Wall -c -fmessage-length = 0 -pthread -Wno-reorder -std = gnu ++ 0x -fstack-protector-all -Wno-format-содержит -nul -Wno-format-extra-args -Wno-format-zero-length),

но на окнах это ловит ошибку правильно.

Когда я пробую пример приложения с теми же параметрами кросс-компиляции, на плате это работает отлично.

Есть ли какие-либо настройки компилятора, которые могли бы способствовать этому поведению, которые я, возможно, не заметил?

Какие-либо предложения?

ниже пример приложения

class ctest
{
public:
ctest()
{

int x = -1;
try {
cout << "Inside try \n";
if (x < 0)
{
throw std::invalid_argument("test");
cout << "After throw (Never executed) \n";
}
}
catch (std::invalid_argument &e)  {
cout << "Exception Caught \n";
}
}void test(){};
};

int main( int argc, char* argv[] )
{
cout << "Before try \n";
ctest c;
cout << "cdone "<<endl;
return 0;
}

2

Решение

Основная причина проблемы, по-видимому, в libjson: JSONStream, который перегружен << & Функция синтаксического анализа, которая действительно генерирует исключение, но в своей подписи у них есть только throw (), указывающая, что она не генерирует исключение.

следовательно, когда исключение происходит на самом деле, терминатор вызывается, как описано здесь
http://www.gotw.ca/publications/mill22.htm

Решение состоит в том, чтобы изменить сигнатуру функций класса libjson JSONStream ( << & parse) — вызвать ошибку в libjson для изменения сигнатуры функций класса JSONStream ( << & синтаксический анализ)

И это работает, наконец.

Компилятор Windows, кажется, игнорирует это, но не компилятор Linux G ++

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]