5

C ++ではstd::runtime_error、ある種のエラーが発生したことを示すために使用する必要がありますか、それとも、std::runtime_errorそれらをより適切に処理できるように、から継承するカスタム例外を作成する必要があります。

たとえば、どういうわけかユーザーから入力を受け取った場合、どちらが良いでしょう:

if (inputInvalid)
{
    throw std::runtime_error("Invalid input!");
}

対...

class invalid_input
    : public std::runtime_error /* or should I inherit from std::exception? */
{
public:
    invalid_input()
        : std::runtime_error("Invalid input!")
    {
    };
};

-------------------------------------------------------

if (inputInvalid)
{
    throw invalid_input();
}

例外処理のより良い使用法と見なされるのはどれですか?

4

4 に答える 4

7

次の 2 つのケースのいずれかでのみ、標準の例外クラスをサブクラス化します。

  1. 標準の例外クラスには、例外の性質を説明する名前がありません
  2. 私の例外には、標準の例外 (つまり、エラーを説明する文字列) にあるものよりも追加の情報が必要です。

そうでなければ、あまり意味がありません。特に、他の人があなたのコードを操作する必要があり、標準例外がしないことを何もしないカスタム例外クラスがなぜあるのか疑問に思う場合。

于 2012-04-26T15:40:14.950 に答える
1

std::runtime_error を継承することで得られるものについて常に考えてください。エラーを簡単に処理できますか?コード例では何の利点もありません。したがって、同じことを行う場合は std::runtime_error から継承しても意味がありません。std::runtime_error よりも多くの情報を追加したい場合は、それらを継承してエラー クラスに追加することをお勧めします。

于 2012-04-26T15:37:57.570 に答える
1

それはプロジェクトの規模によって異なります。小さなものに取り組んでいて、手早く汚いものが必要な場合は、 std:runtime_error で問題ありません。しかし、大きなプロジェクトに取り組んでいる場合は、独自のカスタム例外を作成して、(キャッチを通じて) すべての異なる可能性を管理できるようにする必要があります。そうしないと、キャッチを行った場合、すべてをキャッチすることになります。これは、複数の異なるものを異なる方法でキャッチする必要がある場合に問題になる可能性があります。

私もこれを読みます:

違い: std::runtime_error と std::exception()

于 2012-04-26T15:42:06.687 に答える
1

あなたが与えた例では、invalid_input クラスの std::exception() をサブクラス化します。通常、ユーザー入力エラーは実行時エラーとは見なされません。早期にキャッチしたい場合や、発生時に別のロジックを実行したい場合があります。この場合、runtime_exception からの使用またはサブクラス化は、ほとんどの場合、「is a」テストに失敗します。

于 2012-04-26T17:03:33.987 に答える