【发布时间】:2018-10-18 12:17:58
【问题描述】:
#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”中正常工作!!
所以,我认为这个问题与编译器或操作系统有关。 你能解释一下我该如何解决这个问题吗?
【问题讨论】:
-
作为建议,请使用谚语:“按价值投掷,按引用捕获”。
-
@AlgirdasPreidžius 答案在下面,伙计
-
下次请继续简化问题,直到您拥有可以制作的最小版本。所有类的东西在这里都无关紧要。您最终会尝试删除
throw()(因为这将是剩下的最后一件事)并发现这是问题所在,导致您查看它的实际含义,就像您在编写它时应该做的那样......
标签: c++