コードは一緒に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
この場合)。
前述のようにtry
、catch
これらは独立したエンティティではありません。
コンストラクター内にしようとしている場合でも、次のようにコンストラクター自体内に配置する必要があります。throw
catch
#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