1

リンクされたリストが空のときに EmptyListException をスローしようとしていますが、スローする 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;
}

エラー「このアプリケーションは、ランタイムに異常な方法で終了するように要求しました。詳細については、アプリケーションのサポート チームにお問い合わせください。

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 に答える