1

当我的链接列表为空时,我试图抛出 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
}

-- 在 Main 中捕获

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

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

4

3 回答 3

5

好吧,你告诉编译器你不会从你的Remove()! 当您违反此承诺时,它会终止程序。在函数声明中去掉,throw()然后重试。

于 2012-10-13T18:50:08.827 回答
3

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

于 2012-10-13T18:51:14.007 回答
1

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

通常,它被假设用于精确列出函数可能返回的异常列表(继承照常工作):

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

因此,当在没有空异常列表的情况下使用时,它表明此方法永远不会抛出。如果它抛出,那么运行时将std::terminate立即调用,默认情况下只会终止程序。

通常,您不应使用异常规范。

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

于 2012-10-13T18:56:26.913 回答