当我的链表空为空时,我试图抛出一个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以不寻常的方式终止它。请联系应用程序的支持团队以获取更多信息。
答案 0 :(得分:5)
好吧,你告诉编译器你不要从你的Remove()
中抛出任何异常!当您违反此承诺时,它会终止该程序。在功能声明中删除throw()
,然后重试。
答案 1 :(得分:3)
throw()
函数签名中的Remove
是对编译器的承诺,即您不会在该函数中抛出任何内容。如果你要从里面扔任何东西,你需要删除它。
答案 2 :(得分:1)
问题是throw
说明符是......特殊的。
通常,假设用于精确定义函数可能返回的异常列表(继承像往常一样工作):
void func() throw(Ex1, Ex2, std::bad_alloc);
如果在没有空例外列表的情况下使用,则表明此方法将从不抛出。如果它抛出,那么运行时将立即调用std::terminate
,默认情况下它将终止程序。
通常,您不应使用例外规范。
注意:C ++ 11引入了noexcept
关键字来表示函数永远不会抛出,它更加直观......