1

以下の擬似コードを前提として、クラスBのサブオブジェクトaによってスローされた例外をキャッチし、このオブジェクトをBでプライベートに維持します。オブジェクトaはBでプライベートであるため、以下に示すcatch句は機能しません。この例外をどのようにキャッチできますか?

編集 私は、クラスB内にクラスAを埋め込むように擬似コードを変更しました。

class B
{
    class A
    {
        public:
        class Exception{};
        A() throw(Exception) { ... }  // A ctor throws an Exception class object
    } a;
    public:
    B() { ... }     //  B ctor
};

int main()
{
    try
    {
        B b;
    }
    catch( B::A::Exception& )
    {
        ...
    }

}
4

4 に答える 4

3

クラスが内部で定義されていない限りB::A::Exceptioncatch句で言う必要はありません。これで編集しので、外部に表示され、外部に表示される場合、または他の方法(pmrで提案されているtypedefなど)使用できる場合に適しています。ABB::A::Exception ABExceptionAB::A::Exception

そうでない場合は、それを投げるべきではありません。(この場合はそうではありません。そうです。そうしないでください。)例外の種類さえわからない場合、どのようにしてその例外を合理的にキャッチするのでしょうか。

この作業を行う方法は、クラスの宣言をメンバー変数の宣言から分割することです。ちょっと好き

class B {
 public:
    B() { }

    class A {
     public:
        class Exception {};
        A() { /* throw Exception(); */ }
    };
 private:
    A a;
};

しかし率直に言って、typedefははるかにエレガントに聞こえます。

于 2012-04-22T21:38:25.387 に答える
1

周囲のクラスの例外にtypedefを追加します。

class B
{
    class A
    {
        public:
        class Exception{};
        A() throw(Exception) {  }  // A ctor throws an Exception class object
    } a;

public:
  typedef A::Exception Except;
    B() {  }     //  B ctor
};

int main()
{
    try
    {
        B b;
    }
    catch( B::Except& )
    {

    }

}
于 2012-04-22T21:38:55.807 に答える
1

コンストラクターで例外をスローすることを再考することをお勧めします。理由は次のとおりです(例外をスローしてもデストラクタは呼び出されません)

例外は、実際には例外的な状況のためのものです。それらを使いすぎないでください。

于 2012-04-22T22:14:46.617 に答える
0

プライベートであるため、型にアクセスしてキャッチするAことはできません。Exceptionいくつかの解決策があります。最初は何かをキャッチします:

try {
    B b;
} catch(...) {
}

2 つ目は、main に表示される別個の Exception クラスを作成することです。

B::A::Exception最後に、 extendstd::Exceptionと catchを作成できますstd::Exception

于 2012-04-22T21:55:16.577 に答える