繁体   English   中英

C ++异常未捕获

[英]C++ Exception Not being caught

我试图在我的链表为空时抛出EmptyListException,但如果我取消对throwEmptyListException()的注释,程序将继续终止。 这是我的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;
}

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

好吧,您告诉编译器,您不会从Remove()引发任何异常! 当您违反此承诺时,它将终止程序。 摆脱函数声明中的throw() ,然后重试。

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

问题在于throw说明符非常特殊。

通常,假定它用于精确化函数可能返回的异常列表(继承照常进行):

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM