Thay vì sử dụng toàn cầu, tôi khuyên bạn nên sử dụng tĩnh cục bộ. Khi khởi tạo của vectơ của bạn diễn ra trước khi chính được nhập bất kỳ trường hợp ngoại lệ ném sẽ không bị bắt bởi chính. Nói ví dụ, bạn có một loại mà khi nó được xây dựng có thể ném một ngoại lệ:
class A {
public:
A() {
// ... code that might throw an exception
}
};
Đối với khởi sau, try/catch trong cơ thể của chính sẽ không bắt các ngoại lệ ném ra bởi các nhà xây dựng, vv của bạn chương trình đơn giản sẽ chết ngay lập tức và thậm chí bạn sẽ không thể sử dụng trình gỡ rối để tìm ra nguyên nhân!
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 (...) {
}
}
Một phương pháp khác mà sẽ bắt một ngoại lệ từ các nhà xây dựng là sử dụng một tĩnh địa phương - được khởi tạo bằng cách sử dụng kỹ thuật được đề xuất bởi answer này.
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 (...) {
}
}
Nguồn
2009-04-27 08:58:16
Điều gì về điều này: std :: vector a (3, 100), & a_init ((a [0] = 98, a [1] = 99, a)); nó sẽ làm cho bằng "98, 99, 100" :) –
Chỉ vì tò mò, tại sao bạn cần nó? –