2

私のプロジェクトのコーディングでは、関数の実行ステータスを見つけるために try catch メソッドを使用する必要があります。

   try
   {
      //sample code
      //calling functions
      function1();
      function2();
      //........
   }
   catch(//need to catch exception)
   { 
    return failure;
   }

私の要件は、try ブロックからスローされたすべての例外をキャッチする必要があることです。

ここには 2 つのオプションがあります。

  1. キャッチ(...)
  2. catch(std::例外)

最初のものはすべての例外をキャッチすると思います。2 つ目の std::exception は、プログラム内の他のすべての例外クラスの基本クラスです。

   class MyException : public std::exception
   {
    // All the exceptions that i have use is derived from this class
   }. 

どちらがより良く、より効率的です。

どちらの方法も同じように機能しますか。私を助けて、どんな方法でも提案してください

4

3 に答える 3

4

この場合、次の順序でスローされる可能性のあるタイプを処理します。

catch (MyException& e) {
  ...
}
catch (std::exception& e) {
  ...
}
catch (...) {
  ...
}

このようにして、最初に特定のエラー/タイプを処理し、次に、前のハンドラーが一致しない場合に弱い(または型指定されていない)ハンドラーにフォールバックできます。

どちらがより良く、より効率的です。

タイプ別の取り扱いには、おすすめの順番が最適です。IMO、このシナリオでは効率は問題ではありません。正確さが優先され、例外が例外的な状況でのみスローされることを願っています。

于 2012-04-27T11:11:41.873 に答える
1

スローされる可能性があることがわかっているものをキャッチし、ベースの例外の前に派生した例外(より特殊化されたもの)をキャッチできるように、常に仕様を可能な限り集中させてください。

try
{
    // Some stuff
}
catch (Derived& e)
{
    // Deal with specifics of Derived
}
catch (Base& e) 
{
    // Deal with general case of Base
}

プログラムスタックの最上部以外では使用しないcatch(...)でください(ライブラリでは使用しないでください)。これを行うと、例外の原因を特定できないため、通常の操作(メモリ管理など)に必ずしも依存することはできません。等。)

于 2012-04-27T11:13:04.103 に答える
0

指定された例外のみをキャッチし、main関数でのみcatch(...)を使用することをお勧めします。私の意見では、例外を使用するより良い方法は、モジュールごとに1つの例外を実装することです。これにより、各クラスはクラスのモジュールに関連する特定の例外をスローします。また、異なる例外は異なる方法で処理される可能性があるため、

catch(const ExceptionType1& e){
}catch(const ExceptionType2& e){
}

はより良い解決策です。また、このコードを読んでいる他の開発者は、どの種類の例外がスローされて処理されるかを確認します。

于 2012-04-27T11:12:16.530 に答える