如何从不同的班级捕获异常?

时间:2018-10-18 12:17:59

标签: c++

#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有关。 您能解释一下如何解决这个问题吗?

2 个答案:

答案 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