0

したがって、リンクされたリストのクラス例外を実行していますが、何を入れればよいかわかりません。たとえば、ユーザーがリストに存在しない要素を削除したい場合、「Sparse Exception catch 」と出力されます。 : 要素が見つかりません、削除に失敗しました」または「スパース例外がキャッチされました: スパース行列が空で、印刷に失敗しました」。このままでいいのかな?もしそうなら、どうすればメッセージを印刷できますか?

SparseException::SparseException ()
{
}
SparseException::SparseException (char *message)
{
if (strcmp(message, "delete"))
      cout << "Sparse Exception caught: Element not found, delete fail";
   else
      cout << "Sparse Exception caught: sparse matrix empty, printing failed";
}

void SparseException::printMessage () const
{

}
4

5 に答える 5

4

私の意見では、例外は常に、std::exceptionまたはそのサブクラスの 1 つを継承する必要があります。これにより、実装する必要があるインターフェイスのアイデアが得られます。whatたとえば、メソッドが必要です(実際whatには、おそらくprintMessage印刷されるものを返します)。また、例外のメッセージを本当に出力したい場合は、operator<<.

コードがスローした例外を a がキャッチするstd::exceptionことがわかるように、継承が必要です。catch(std::exception& ex)

于 2013-02-14T10:03:34.910 に答える
0

だから私はリンクされたリストのクラス例外をやっていますが、何を入れるべきかわかりません.

まず、std::exception 階層からの継承を検討します (通常、std::runtime_error または std::logic_error から継承します)。エラーを説明する文字列メッセージを受信する基本クラスを提供し、クライアント コードがジェネリック std::exception ref をキャッチして例外を受信および処理できるようにします。

たとえば、ユーザーがリストに存在しない要素を削除したい場合、「Sparse Exception catch: Element not found, delete fail」または「Sparse Exception catch: sparse matrix empty, printing failed」が出力されます。このままでいいのかな?

通常、エラーを説明する完全なメッセージ (ログに記録できる文字列) を使用する必要がありますが、例外の種類は使用しないでください (例外クラス階層に任せてください)。

あなたの場合:

class SparseException: public std::runtime_error
{
public:
    SparseException(const std::string& message): std::runtime_error(message) {}
};

あなたのキュー:

// ... 
if (whatever1)
    throw SparseException("element not found, delete failed");

// ...
if (whatever2)
    throw SparseException("sparse matrix empty, printing failed");

もしそうなら、どうすればメッセージを印刷できますか?

クライアントコード:

try
{
    // ...
} catch(const SparseException& e)
{
    std::cerr << "SparseException: " << e.what() << "\n"; // what() is a member
                                                          // of std::exception
}
于 2013-02-14T10:41:39.600 に答える
0

@Ivaylo の投稿に次の行を追加

if (strcmp(message, "delete"))

読むべき

if (0 == strcmp(message, "delete"))
于 2013-02-14T10:05:38.237 に答える
0

custom を作成する場合は、 orのようなサブタイプExceptionから継承することをお勧めします。また、例外クラスにメッセージを出力しても意味がありません。それはクライアントの責任です。詳細な例外メッセージを返すオーバーライドメソッドのみが必要です(つまり、 orのデフォルトの実装は通常問題ありません)。std::exceptionruntime_errorlogic_errorwhatruntime_errorlogic_error

ステートメントif (strcmp(message, "delete")) {...}もほとんど意味がありません(実際にはそうあるべきです!strcmp(...))。別のメッセージを出力したいだけなら、そのメッセージを例外のコンストラクターに渡すだけで十分です。ただし、例外を区別する必要がある場合は、SparseDeletionExceptionまたはのようSparseEmptyExceptionなクラスを追加することをお勧めSparseExceptionしますstd::exception

于 2013-02-14T10:06:08.347 に答える
0

通常、例外クラスには、問題の原因に関する情報が含まれているだけです。通常、文字列には「ファイル c:/a.txt への 123 の書き込みに失敗しました」という必要なものすべてを含めることができるため、文字列が含まれます。

あなたが提示した単純なケースでは、異なるクラスの例外 (SparseDeleteException など) を使用する必要があります。または、エラー テキストを取得するためのより複雑なロジックが必要な場合は、別のクラスを使用して "エラー ID" -> "エラー文字列" 変換を処理することをお勧めします。これは例外のタスクではないためです。

さらに、例外toStringには print ではなくメソッドが必要です。キャッチ メソッドは、メッセージの処理方法を決定できる必要があります。

于 2013-02-14T10:07:15.860 に答える