#include <iostream>
using namespace std;
class A{
public:
void func1() throw(){
cout << "func1 throw 1\n";
throw 1;
}
};
class B{
public:
A a;
void func2(){
try{
a.func1();
}
catch(int e){ //terminate called after throwing an instance of 'int'
cout << "func2 catch " <<e;
}
}
};
int main(){
B b;
b.func2();
return 0;
}
这是我问题的简化版本... 类A中有一个函数A :: func1()。 然后抛出1;
然后是类B,它从func2()调用A :: func1()。 然后我做了try-catch子句来捕获A :: func1()抛出的1,从现在开始我遇到了问题...
当我从main()调用B :: func2()时,出现运行时错误 “在引发'int'实例后调用终止。”
在“ g ++(Ubuntu 5.4.0-6ubuntu1〜16.04.10)5.4.0 20160609”中出现此问题。 并且可以在“ Window 10”的“ Visual Studio 2017”中正常工作!
因此,我认为此问题与编译器或OS有关。 您能解释一下如何解决这个问题吗?
答案 0 :(得分:9)
这与类无关,无论它们是否相同。
void func1() throw(){
cout << "func1 throw 1\n";
throw 1;
}
func1
上有throw()
,表示“此函数不会引发异常”。
然后引发异常。
这会导致调用std::terminate
,因为它是错误的。
您会在Windows上看到不同的行为,因为在某些模式下使用Visual Studio时,the result is undefined without std::terminate
being called也是错误的。
删除throw()
。
答案 1 :(得分:5)
throw()
是noexcept
的不推荐使用的同义词,即您的函数将永远不会抛出任何东西。
允许noexcept
函数处理未处理的异常会导致立即调用std::terminate
。