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