2009-03-27 9 views

答えて

25

はい、それはstd::runtime_errorからinheritstd::logic_errorようother standard exception classesstd::invalid_argumentというように、例外のどの種類に応じて、それがすることをお勧めします。

例外がすべてstd::exceptionから継承されている場合は、すべての一般的なエラーをcatch(const std::exception &e) {...}で簡単にキャッチできます。複数の独立した階層がある場合、これはより複雑になります。特別な例外クラスから派生することにより、これらの例外はより多くの情報を保持しますが、実際にはこの例外がどのように扱われるかは、例外処理の仕方によって異なります。

+6

キャッチ(std ::例外const&e) –

+0

はい、それは良い、変更されました... – sth

1

std :: exceptionを継承するかどうかは関係ありません。私にとっては、例外を定義する上で最も重要なことは、次のとおりです。

  1. 例外クラス名を有益かつ明確にすること。
  2. 関数またはクラスメソッドによって例外がスローされることを明確に文書化する(コメントを書く)。これは、私の意見で例外処理の最大の失敗点です。
1

std::runtime_errorstd::exceptionを継承しているため、大きな違いはありません。実行時エラーは例外に関する詳細情報を伝えると主張することもできますが、実際には基本例外クラスから派生していることがよくあります。

6

私はC++開発者ではないんだけど、私たちはC#のコードでやった一つのことは、私たちのフレームワークの基本クラスの例外を作成し、コンストラクタでスローされた例外を記録しました:

public FrameworkException(string message, Exception innerException) 
     : base(message, innerException) 
    { 
     log.Error(message, innerException); 
    } 

    ... 

は、任意の派生例外は基本コンストラクタを呼び出すだけで、一貫性のある例外ログを取得できます。大したことではありませんが、便利です。

+0

特に例外の構築自体が例外をスローする可能性がある場合は、派手な例外に注意する必要があります。 – Herbert

3

例外がいくつかのスコープに置かれていると良いことです。例えば、クラス操作は例外クラス内のエラーを宣言できます。

と、彼らはあなたが設計しない限り、任意の追加のエラー情報なしに単に空のクラスすることができ、このようなケースでは

catch (const Manipulation::InputError& error) 
catch (const Manipulation::CalculationError& error) 

のようにそれらをキャッチすることは、すべての標準の例外をキャッチどここれらの例外は、上側多くを飛ぶことができます。

関連する問題