2012-10-13 123 views
1

当我的链表是空的时,Im试图抛出一个EmptyListException,但是如果我取消注释throw EmptyListException(),程序会一直终止。 这是我EmptyListException头C++异常不被捕获

#ifndef EMPTYLISTEXCEPTION_H 
#define EMPTYLISTEXCEPTION_H 

#include <stdexcept> 
using std::out_of_range; 
class EmptyListException : public out_of_range 
{ 
    public: 
     EmptyListException(): out_of_range("Empty List!\n") {} 

}; 

#endif // EMPTYLISTEXCEPTION_H 

- 在Clist.h扔命令

template <typename E> 
E Clist<E>::Remove() throw() 
{ 
    if(isEmpty()) 
    { 
     cout << "Empty List, no removal"; 
     //throw EmptyListException(); 
     return '.'; 
    } 
     ... code 
} 

- 抓主

try{ 
    cout << list->Remove() << endl; 
} catch(EmptyListException &emptyList) 
{ 
    cout << "Caught :"; 
    cout << emptyList.what() << endl; 
} 

错误“此应用程序已请求运行时以不寻常的方式终止它。请联系应用程序支持团队以获取更多信息。

+0

为什么'回报;' ''? E不一定是字符。 – LeeNeverGup

+3

尝试从Remove()的定义中移除'throw()'。 – xaizek

+0

return'。';我只想结束这个功能,我想发回一个空的数据类型。通常这个函数返回被删除的节点数据 – George

回答

5

那么,你告诉编译器,你不会抛出你的Remove()的任何异常!当你违反这个承诺时,它终止程序。在函数声明中删除throw()并重试。

+0

谢谢,所有问题修复,更新原始帖子。 – George

3

throw()在你的Remove函数的签名中是对编译器的承诺,你不会在该函数中抛出任何东西。如果你打算从里面扔任何东西,你需要删除它。

1

问题是throw说明符是......特殊的。

通常情况下,它是假设被用来精确例外列表的功能可能会返回(与继承工作照常):

void func() throw(Ex1, Ex2, std::bad_alloc); 

当而没有空的例外列表中使用,因此它表明,此方法将从不扔。如果抛出,那么运行时将立即调用std::terminate,默认情况下,它将仅仅终止程序。

通常,您不应该使用例外规范。

注:C++ 11引入了noexcept关键字指示函数不会抛出,它更直观...