用Iibjson试试,catch不起作用,在目标Cross编译linux板

时间:2016-05-02 11:57:58

标签: c++ linux libjson

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

 }
}

当我创建此类的对象时,它会在抛出&#39; std :: invalid_argument&#39;的实例后给出错误并停止调用。

这是在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;
}

1 个答案:

答案 0 :(得分:0)

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

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

解决方案是更改libjson JSONStream类函数的签名(&lt;&lt;&amp;&amp; parse) - 在libjson中引发错误票证以修改JSONStream类函数的签名(&lt;&lt;&amp; parse) )

它终于有效了。

Windows编译器似乎忽略了这一点,但没有忽略linux g ++编译器