С 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;
}

1 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам