我的开发环境是:Ubuntu 16.04 64bit。 g ++ 5.4.0 64位工具链。我正在将一些代码从Windows迁移到Linux,这些代码调用了ASIO lib。在某些地方,我必须有一个逻辑来捕获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 main.cpp 45
我的C ++编译器标志是:-g;-std=c++14;-Wall;-fexceptions;-fPIC
更新
一些评论者指出,问题可能出在我的项目代码的其他地方。所以我从头开始创建一个新的空项目,main.cpp
。使用上面显示的代码。仍然是同样的问题。
更新1:
我仍然不确定究竟是什么问题。但看起来我的GNU版本工具链没有正确设置。我从版本x获得了gcc,从版本Y获得了g ++。所以我重新安装了编译器并重置了他们的符号链接。使用this page作为手册。
答案 0 :(得分:0)
必须在标头中声明要捕获的异常抛出异常。试试这个
class Foo {
public:
Foo(){}
void ThrowExc() throw (std::exception) {
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;
}
}