私はスローしてキャッチする特別な例外をいくつか持っているので、私は自分の例外クラスを定義したいと思います。独自の例外クラスを定義するベストプラクティス?
そのベストプラクティスは何ですか? std::exception
またはstd::runtime_error
から継承する必要がありますか?
私はスローしてキャッチする特別な例外をいくつか持っているので、私は自分の例外クラスを定義したいと思います。独自の例外クラスを定義するベストプラクティス?
そのベストプラクティスは何ですか? std::exception
またはstd::runtime_error
から継承する必要がありますか?
はい、それはstd::runtime_error
からinheritかstd::logic_error
ようother standard exception classes、std::invalid_argument
というように、例外のどの種類に応じて、それがすることをお勧めします。
例外がすべてstd::exception
から継承されている場合は、すべての一般的なエラーをcatch(const std::exception &e) {...}
で簡単にキャッチできます。複数の独立した階層がある場合、これはより複雑になります。特別な例外クラスから派生することにより、これらの例外はより多くの情報を保持しますが、実際にはこの例外がどのように扱われるかは、例外処理の仕方によって異なります。
std :: exceptionを継承するかどうかは関係ありません。私にとっては、例外を定義する上で最も重要なことは、次のとおりです。
std::runtime_error
もstd::exception
を継承しているため、大きな違いはありません。実行時エラーは例外に関する詳細情報を伝えると主張することもできますが、実際には基本例外クラスから派生していることがよくあります。
私はC++開発者ではないんだけど、私たちはC#のコードでやった一つのことは、私たちのフレームワークの基本クラスの例外を作成し、コンストラクタでスローされた例外を記録しました:
public FrameworkException(string message, Exception innerException)
: base(message, innerException)
{
log.Error(message, innerException);
}
...
は、任意の派生例外は基本コンストラクタを呼び出すだけで、一貫性のある例外ログを取得できます。大したことではありませんが、便利です。
特に例外の構築自体が例外をスローする可能性がある場合は、派手な例外に注意する必要があります。 – Herbert
例外がいくつかのスコープに置かれていると良いことです。例えば、クラス操作は例外クラス内のエラーを宣言できます。
と、彼らはあなたが設計しない限り、任意の追加のエラー情報なしに単に空のクラスすることができ、このようなケースでは
catch (const Manipulation::InputError& error)
catch (const Manipulation::CalculationError& error)
のようにそれらをキャッチすることは、すべての標準の例外をキャッチどここれらの例外は、上側多くを飛ぶことができます。
キャッチ(std ::例外const&e) –
はい、それは良い、変更されました... – sth