2011-06-29 42 views
3

请看看演示代码:一些问题有关异常处理

class myError 
{ 
    const char* str; 
public: 
    myError():str(NULL) {} 
    myError(const char* temp) 
    { 
     str = temp; 
    } 
    const char* what() 
    { 
     return str; 
    } 
}; 

class ab 
{ 
    int x; 
public: 
    ab() try :x(0) 
    { 

      throw myError("error occured in the constructor of class ab"); 
    } 
    catch(myError& temp) 
    { 
     std::cout<<"Handler no. 1 of ab constructor"<<std::endl; 
    } 
}; 

int main() try 
{ 
    ab bb; 
    cout << "Resumed execution!" << endl; 
    return 0; 
} 
catch(myError& temp) 
{ 
    std::cout<<"Handler below the main function"<<std::endl; 
    std::cout<<"And the error is :" <<temp.what(); 
} 

我的问题:构造函数的

  1. 为什么只有功能try块的处理器和析构函数只rethows例外呢? ,

,当你简单地抛出内部构造函数的异常,其处理程序不会重新抛出的对象?即

Ctor::Ctor() 
{ 
    try{ 
     throw Excep1(); 
    } 
    catch(Excep1& temp) { 
     std::cout<<"Doesn't rethrows the exception object"; 
    } 
} 
  1. 我想知道如何恢复控制权交还给cout << "Resumed execution!" << endl;,处理重新抛出对象后?

  2. 为什么经常说,我们不应该把功能try块在析构函数的基类的?

+0

的析构函数,你的意思析构函数? – MGZero

+0

@ MGZero:是) –

+0

我看不出在你的代码中重新抛出。你只是捕捉例外。 – VestniK

回答

7

通常的规则是:catch块不重新抛出,除非你要求它 来。你将如何阻止异常传播,否则。在 构造的情况下,然而,如果事情在初始化 列表抛出,那么你还没有得到完全构造的对象;有 什么,你可以与对象做,甚至没有调用析构函数上 它。如果构造函数的功能catch块不 重新抛出,什么是它要做的事情,因为它不能简单地返回(和 离开堆栈上的变量)?

在所有其他情况下,包含catch块 的函数知道该怎么做。在的情况下,你的主,比如,你可以写 : 尝试{ AB BB; }赶上(...){} 性病 ::法院< < “恢复执行!” < < std :: endl;

你不能做的是执行代码,其中bb将在范围内, 可访问,但没有正确构建。至于为什么你不应该在基类的析构函数上放置函数try块,我从来没有听说过这个规则。一般来说,破坏者 不应该抛出,所以没有必要将它们封装在一个try块中, 期间。

+0

引用您的最后一个段落:请问为什么基类的dtor不会抛出异常? ,谢谢 –

+0

@MrAnubis:析构函数不应该抛出,因为当发生异常并且堆栈被解开时它们被调用。所以,如果你有一个异常,然后调用一个dtor抛出一个异常,你只会抛出一个异常,*而另一个被抛出。不好的事情发生了('terminate()'被调用,我认为)。 –

+0

谢谢你这么好的解释。 –

1

对于第二个问题,析构函数不应该是抛出期。考虑一下你的析构函数通过delete释放大量内存的情况。如果你的析构函数在完成清理之前抛出一个错误会发生什么?你现在有一个内存泄漏。如果你的析构函数导致运行时错误,那么你的代码中的其他地方可能有问题需要修复。

0

由于通常,香草萨特知道并说明了一切:

如果处理器主体包含语句“扔”;那么catch块显然会重新抛出A :: A()或B :: B()发出的异常。不太明显的,但在标准中明确指出的是,如果catch块不抛出(重新抛出原始异常或抛出新东西),并且控制达到构造函数或析构函数的catch块的末尾,那么原始异常会自动重新生成。

More in his article