-1

多くの例を見ましたが、単純なコンストラクターで try catch を使用する方法を理解できません。サンプル プログラムを作成しました。

class A
 {
   public:
    try {
       A()
        { cout << "in costr\n"; throw 10;}
    }//try closed
   catch (int a)
{ cout << "caught 1 \n"; }

 };

main()
 {
   A *ptr = new A;
   }
  1. このプログラムはコンパイルエラーを出します
  2. 例外がキャッチされた場合、オブジェクトはどうなりますか??
4

6 に答える 6

8

コードは一緒にtry/catchあるはずです。どちらか一方がなければ、もう一方を使用することはできません。このようなものは、あなたが求めているものです:

A *ptr;
try {
    ptr = new A();
} catch (int a) {
    cout << "caught 1\n";
}

完全な動作例については、次のプログラムを参照してください。

#include <iostream>

class A {
    private:
        int a;
    public:
        A() { a = 7; throw 42; }
        int getA() { return a; }
};

int main (void) {
    A *ptr;
    try {
        ptr = new A();
    } catch (int b) {
        std::cout << "Exception: " << b << '\n';
        return -1;
    }
    std::cout << "Value: " << ptr->getA() << '\n';
    return 0;
}

そこにあるthrow 42と、次のことがわかります。

Exception: 42

mainコンストラクターからの例外をキャッチしたことを意味します。がないthrow場合は、次のように表示されます。

Value: 7

すべてが機能したからです。


コードの主な問題は次のようです。

  • tryあるべきではないところにステートメントがあります。Try/catchブロックは通常、関数またはメソッドpublicにある必要があります。キーワードの直後に配置します。

  • コンストラクターから例外をスローしている場合、コンストラクターでそれをキャッチしません。代わりに、コンストラクターを呼び出したコードでキャッチします(mainこの場合)。

  • 前述のようにtrycatchこれらは独立したエンティティではありません。


コンストラクター内にしようとしている場合でも、次のようにコンストラクター自体に配置する必要があります。throwcatch

#include <iostream>

class A {
    private:
        int a;
    public:
        A() {
            try {
                a = 7;
                throw 42;
            } catch (int b) {
                std::cout << "Exception A: " << b << '\n';
                throw;
            }
        }
        int getA() {return a;}
};

int main(void) {
    A *ptr;
    try {
        ptr = new A();
    } catch (int b) {
        std::cout << "Exception B: " << b << '\n';
        return -1;
    }
    std::cout << "Value: " << ptr->getA() << '\n';
    return 0;
}

これにより、次のことが得られます。

Exception A: 42
Exception B: 42

ブロックが完全であり、コンストラクター関数にあることに特に注意してください。try/catch

于 2012-08-10T05:20:24.567 に答える
5

コンストラクター中に発生する例外の問題は、関数 try ブロックによって対処されます。

class A
 {
   public:
       A()
       try 
         { cout << "in costr\n"; throw 10;}
      catch(...)
        { cout << "exception caught"; throw;}
 };

しかし、彼らが取り組んでいるシナリオは、あなたの例とは異なります。関数の try ブロックは、クラス コンストラクターが再利用する必要があるリソースを割り当てるときに必要です。コンストラクターがスローした場合 (破棄するものがないため、クラスは最初から構築されていません)、クラスのデストラクターは実行されないため、この問題に対処する 1 つの方法は、コンストラクターで関数 try ブロックを使用することです。コンストラクター関数の try ブロックは、例外または元の例外を再スローする必要があることに注意してください。キャッチされた例外を黙らせることはできません。

あなたが求めている質問のより詳細な議論 (コンストラクター中に例外が存在する場合のオブジェクトのスコープ/ライフタイムは何ですか) については、GOTW#66を参照してください。

于 2012-08-10T05:39:51.753 に答える
5

コンストラクターでスローされた例外を再スローせずに処理したい場合は、try-catch ブロックをコンストラクターに配置するか、コンストラクターの初期化リストを囲む必要があります。

class A
 {
  public:
   A() {
     try {
       // some code that could throw int
       cout << "in costr\n"; throw 10;}
     }//try closed
     catch (int a) {
       cout << "caught 1 \n";
     }
   }
   explicit A(int i) try : functionThatCanThow(i) catch (int)
   { }

 };

main()
{
   A *ptr = new A;
   A* ptr2 = new A(5);
}
于 2012-08-10T05:40:25.683 に答える
2

次のような意味でしたか:

#include <iostream>

class A
{
    public:
        A() 
        {   
            std::cout << "in costr\n";

            // An exception
            // of type `int`
            throw int(10); 
        }   
};

int main()
{
    // A try block were something may go wrong.
    try 
    {   
        A *ptr = new A;
    }   
    // A try is followed by one or more catch blocks
    // that can be activated if an exception is thrown
    catch (int a)
    {   
        std::cout << "caught 1 \n";
    }   
}
于 2012-08-10T05:22:52.933 に答える
1

try と catch を組み合わせる必要があります...

class A
{
  public:
    A() { cout << "in costr\n"; throw 10; }
};

int main()
{
    try
    {
        A* ptr = new A;
    }
    catch (int a)
    {
        cout << "caught " << a << '\n';
    }
}
于 2012-08-10T05:20:58.157 に答える