用iibjson试试,catch不行,在target Cross compiled linux board

With Iibjson try, catch is not working, in target Cross compiled linux board

我在 C++ 的构造函数中尝试捕获 class

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"
    }

 }
}

当我创建这个 class 的对象时,它给出错误并在抛出 'std::invalid_argument'.

的实例后停止调用终止

这是在 ARM 上交叉编译的情况(使用 -O0 -g3 -Wall -c -fmessage-length=0 -pthread -Wno-reorder -std=gnu++0x -fstack-protector-all - Wno-format-contains-nul -Wno-format-extra-args -Wno-format-zero-length) ,

但是在 windows 上它正确地捕获了错误。

当我尝试使用来自交叉编译的相同选项的示例应用程序时,它在板上运行完美。

是否有任何我可能没有注意到的可能导致此行为的编译器设置?

有什么建议吗?

下面是示例应用程序

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

问题的根本原因似乎在libjson:JSONStream,它有重载的<< & parse函数确实会抛出异常,但在他们的签名中他们只是throw(),表明它不会抛出异常。

因此,当实际发生异常时,将按照此处的说明调用终止 http://www.gotw.ca/publications/mill22.htm

解决方案是更改 libjson JSONStream class 函数的签名(<< & 解析)- 在 libjson 中提出错误单以修改 JSONStream class 函数的签名( << & 解析)

终于成功了。

Windows 编译器似乎会忽略这一点,但 linux g++ 编译器不会