グローバルを使用するのではなく、ローカル静的。メインが入力される前にベクタの初期化が行われるため、スローされた例外はmainによって捕捉されません。あなたはそれが構築されていますタイプが例外をスローすることが持っている、たとえば言う:次の初期化のために
class A {
public:
A() {
// ... code that might throw an exception
}
};
、メインの体内でのtry/catchはコンストラクタによってスローされた例外をキャッチし、ので、あなたはありませんプログラムはただちに終了し、おそらくデバッガを使って原因を突き止めることさえできません。
std::Vector<A> v(5, A()); // May throw an exception here not caught by main
int main() {
try {
// Exception for 'v' not handled here.
}
catch (...) {
}
}
コンストラクタから例外をキャッチする別のアプローチは、ローカル静的使用することである - このanswerによって提案手法を用いて初期化されます。
std::Vector<A> init(); // Returns a vector appropriately initialized
std::vector<A> & getV() {
static std::vector<A> cache = init();
return cache;
}
int main() {
try {
getV().at[0]; // First call to getV - so initialization occurs here!
}
catch (...) {
}
}
何本約1:のstd ::ベクトル(3、100)、&a_init(([0]、[1] 99 = 98 = A))。それは "98,99,100"に等しくなります:) –
好奇心の外に、なぜあなたはそれを必要としますか? –