【发布时间】:2018-02-04 08:14:40
【问题描述】:
我的开发环境是:Ubuntu 16.04 64bit。 g++ 5.4.0 64 位工具链。我正在将一些涉及ASIO lib 的代码从Windows 移植到Linux。在某些地方我必须有一个逻辑来捕获来自asio::read() 和asio::write() 的异常。并且这些都没有被 try...catch() 捕获,无论是在发布模式还是在调试模式下。因此,要了解 ASIO 的问题还是我对它的使用,我只需将此代码放在我的 main.cpp 中:
class Foo
{
public:
Foo(){}
void ThrowExc()
{
throw std::runtime_error("I am exception!");
}
};
int main(int argc, char *argv[])
{
Foo f;
try
{
f.ThrowExc();
}
catch(std::exception &e)
{
std::cout<<"Exception caught" << std::endl;
}
它不起作用。程序崩溃,调用堆栈如下所示:
0 0x00007ffff57188bd __cxa_throw
1 0x000000000040e5ab Foo::ThrowExc /main.cpp 32
2 0x000000000040d16c 主 main.cpp 45
我的 C++ 编译器标志是:-g;-std=c++14;-Wall;-fexceptions;-fPIC
更新:
一些评论者指出问题可能出在我的项目代码的其他地方。所以我从头开始创建了一个新的空项目,仅限main.cpp。使用上面显示的代码。还是一样的问题。
更新 1:
我仍然不确定确切的问题是什么。但看起来我的 GNU 版本工具链设置不正确。我有版本 x 的 gcc 和版本 Y 的 g++。所以我重新安装了编译器并重置了它们的符号链接。手动使用this page。
【问题讨论】:
-
我多么喜欢那些反对者。 const 在这里不是问题。谢谢你的提示。讨厌的地方已经变成了问东西。
-
@user0042 不正确。参考文献this
-
@user0042 但您可能希望在重新抛出之前向异常添加一些重要信息
-
@user0042 - 最好使用所有 OP 的编译器标志。 But yes, no reproducing it with them as well.
-
@user0042 - 依赖“句点”的参数是不好的参数。它们大多表明您无法如实支持您的主张,因此需要依赖教条。