2

我在 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-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;
}
4

1 回答 1

0

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

因此,当异常实际发生时,终止被调用,如此处所述 http://www.gotw.ca/publications/mill22.htm

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

它终于奏效了。

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

于 2016-05-04T11:47:31.923 回答