C ++ Exception没有被捕获

时间:2012-10-13 18:44:58

标签: c++ exception

当我的链表空为空时,我试图抛出一个EmptyListException,但是如果我取消注释throw EmptyListException(),程序将继续终止。 这是我的EmptyListException标题

#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;
}

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

3 个答案:

答案 0 :(得分:5)

好吧,你告诉编译器你不要从你的Remove()中抛出任何异常!当您违反此承诺时,它会终止该程序。在功能声明中删除throw(),然后重试。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

通常,假设用于精确定义函数可能返回的异常列表(继承像往常一样工作):

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

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

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

注意:C ++ 11引入了noexcept关键字来表示函数永远不会抛出,它更加直观......