質問

と聞いていきた文字列があるのでなんだんに期待することができました。何が良い練習のための投例外?いを受け継ぐベースの例外クラス?ついて多くの例外はも?いMyExceptionClass&又はconst MyExceptionClass&?など。もん例外はあってスローされるdestructors

私は追加することを理解してい設計により契約がスローします。思いどういうスロー例外をスローしました。

役に立ちましたか?

解決

私の意見は、関数は例外をスローする場合することはできなく"約束"であれば突破の"契約".この機能の署名(名前とパラメータを決定し、その契約になります。

これらの二つのメンバ関数:

const Apple* FindApple(const wchar_t* name) const;
const Apple& GetApple(const wchar_t* name) const;

これらの機能とその戻り値を示すようにしてほしの場合 FindApple その機能は完全にNULLを返す場合、正しいapple見つかりませんでしたが、の場合 GetApple い込んでした。また第二の機能を維持できず、その約束、例外をスローします。

例外としての者は例外条件の機能はその他の方法報告されます。決定をした場合は、一部の約束(読み:機能署名)で報告することができるものとする状態になる例外。

るということに注意してくださの場合 FindApple, で呼び出し側に決めるような条件を見つけていない右apple"な例外的な状態です。

うに誘惑されることをしないようにしてすべての例外を除き、その手段として口座のすべての例外的な状況だけの負担を呼び出し側です。呼び出し側のニーズをチェックのための"エラー条件でした。

最終的には、例外のニーズに対応ていただけるように、呼び出し側が 先番号は予約確認通知に特定の条件の方法として大変有益なもので.ということに最大限の解釈:サービスが今後で再試行せよ、UIを提供するもエラーメッセージ、webアプリケーションの提供"恥"の画面が回収するも...います。

Dave

他のヒント

1つの基本的な事は唯一例外的な状況の例外を予約することです。フロー制御のためにそれらを使用しないでください。例えば、「ファイルが見つかりません」例外があってはならない、それはエラーコードまたは戻り値でなければならない(ファイルにのものでなければなければならないの存在、例えば、構成ファイル)。あなたがそれを処理している間にファイルが突然消えた場合でも、例外をスローすることは良い選択です。

例外は控えめに使用されている場合は、

、あなたはより深い層から不可解・イン・ザ・コンテキストの例外を受けないようにするために、のtry-catch -spaghettiにコードをオンにする必要はありません。

標準の例外を使用してください!あなたが特定のエラーを持っている場合は、戻り値でそれを避けるようにしてください。あなたは例外を使用する必要がありますのの場合は、Exceptionから継承し、カスタムメッセージを作成し、カスタム例外を定義します。

時にはあなたがエラーコードなどを返却することはできませんことを発生することがあります。あなたは、例えば、エラー状況が発生したときの正確な状況を、必要なとき。あなたは3つのレベルアップエラー状態を伝播する必要がある場合 - あなた緩いコンテキスト

このような状況のカスタムクラスでは最高のソリューションです。

:例えば、私は(唯一の.h彼らのために何の.cppはありません)私自身のインラインクラスを定義し、このアプローチを使用しています。
class DeviceException {
    ;
}

class DeviceIOException: public DeviceException {
    DeviceIOException(std::string msg, int errorCode);
}

など。

私は、種類によっておよび内に含まれる情報によって例外に基づいて行動/判断することができます。

私は常に例外をスローするメッセージが発生し、どのよう:

throw NException("Foo::Bar", "Mungulator cause a stack overflow!");

を利用できますこれらの文字列messageboxes。

いつもチによ

catch (NException& ex) { ... }

場合は、windowsを渡すことができ、エラー値および機能を導き出すエラーメッセージを表示します。最高の例であ WindowsのC/C++によるジェフリー-リヒタ.

投ポインタがなくて良いので複雑なものにの所有権がスローされます。クラスタイプの例外を除いては以上の基礎だからといって、仕事を含むことができる情報については理由の例外です。

を使うためのクラスまたはクラス階層があり、カップルポイントのまだ安定していません:

  1. 両方のコピーコンストラクタ デストラクタは、例外オブジェクト なければならな例外をスローします。の場合 いいプログラム 終了す。(ISO15.5/1)

  2. 場合は例外オブジェクトベース 授業、そして公共継承関係を示します。
    ハンドラでのみ選択 を導出することにより基底クラスの場合はベース クラス アクセス.(ISO15.3/3)

  3. 最後に、すべての例外タイプ)を この表現がスローされません その結果、例外がスローされます。

例えば:

class Ex {
public:
  Ex(int i) 
  : m_i (i)
  {
    if (i > 10) {
      throw "Exception value out of range";
    }
  }

  int m_i;
};


void foo (bool b) {
  if (! b) {
     // 'b' is false this is bad - throw an exception
     throw Ex(20);    // Ooops - throw's a string, not an Ex
  }
}

あなたはいつものstd ::例外から派生した例外クラスをスローする必要があります。これはあなたのインターフェイスに特定の一貫性を可能にし、これらのメソッドや関数のクライアントに、より柔軟に行うことができます。たとえばあなたが

catch(std::exception& e)
ブロックを追加し、できることがあり、すべてのハンドラがそれを行うことがキャッチを追加したい場合。 (あなたが投げることができるすべてのコードをコントロールしていない場合は、多くの場合、あなたはそれで逃げることはできませんが)。

私は、標準的な(すなわち、STD :: runtime_error)によって提供される唯一の例外をスローする傾向がありますが、あなたのハンドラに余分な粒度を提供したい場合は、STD ::例外からあなた自身を派生して自由に感じるはずです。 C ++よくある質問liteのを参照してください。

また、あなたは一時的に投げると、(自分のキャッチサイトで呼び出されるコピーctorのを避けるために)参照することによってそれをキャッチする必要があります。メモリをクリーンアップする必要があります誰が不明であるため、ポインタを投げることもひんしゅくを買うされます。あまりにもこれに C ++よくある質問Liteのを扱っています。

のための現在のプロジェクトにとって、適切な行動を取れたということもありますが、主要グループを実行します。基本プログラムを受け入れのXMLメッセージを保存する情報をデータベース化と公正な処理量!

  1. データの誤りを示すように入力します。適切なアクションは保存するメッセージのログディレクトリがない工程です。
  2. インフラのエラーを表示一部のsubcomponentのように入力キューには、SQLデータベースは、JNI図書館)が正常に動作しません睡眠のための数分そしてもう一度接続してください。
  3. 構成エラーを表示一部の側面の構成は難加工.終了プログラムを終了します。

最初の項目がチェック例外で考慮したデータを確認する方法のインタフェース。その他にチェック以降の主なループを知ることはできないが、実装のサブコンポーネントなど実装する条件がある場合は、このSQLデータベース、単に続くデータメモリの呼び出し側は必要ありませんになっています。

あなたは他の開発者が川下使用するコンポーネントから例外をスローしている場合は、

、彼らに大きな恩恵を行うと、常にSTDから独自の例外クラス(あなたが本当に標準の例外を使用してc.fそれらを必要とする場合)::例外を派生してください。 int型を投げるようにすべてのコストで全く憎むべきを避けるため、HRESULTS、char型*、STD ::文字列...

すでにだけ例外的な状況のためにそれらを使用すると言われていたよう。

常に例えば、例外をスロー避けるために、ユーザーのための方法を提供します。あなたがメソッドを持っている場合、それは何かが、このようにうまくいかない場合スローされます:

public void DoSomethingWithFile() {
    if(!File.Exists(..))
        throw new FileNotFoundException();
}

コールするユーザーのための別の方法を提供します:

public bool CanDoSomething() {
    return File.Exists(..);
}
彼が望んでいる場合は、

が、この方法では、呼び出し側が例外を回避することができます。 「フェイルファスト」が、常に例外フリーパスを提供します。

- 何かが間違っている場合は投げることを躊躇しないでください。

また、フラットあなたの例外クラスの階層構造を維持し、InvalidStateExceptionとArgumentNullExcpetionなどの標準の例外を見てみます。

ここではほとんどすべてのリソースを要する例外をスローする簡単な例があります:

class DivisionError {};
class Division
{
public:
    float Divide(float x, float y) throw(DivisionError)
    {
        float result = 0;
        if(y != 0)
            result = x/y;
        else
            throw DivisionError();
        return result;
    }
};

int main()
{
    Division d;
    try
    {
        d.Divide(10,0);
    }
    catch(DivisionError)
    {
        /*...error handling...*/
    }
}

スローされ、空のクラスは、任意のリソースまたは非常に少数を取ることはありません...

C ++よくある質問から、 [17.12]私は何をスローする必要があります?のます:

  

一般的に、それはオブジェクトではなく、ビルトインをスローするのが最善です。   可能な場合は、そのクラスのインスタンスをスローする必要があります   std::exceptionクラスから(最終的に)導出ます。

...と

  

最も一般的な方法は、一時的にスローすることです。   (以下の例を参照)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top