http://ideone.com/UtVzxwHãy thử cú pháp bắt constructor
struct base
{
base() { throw std::exception(); }
};
struct derived : public base
{
derived() try : base() { }
catch (std::exception& e)
{
std::cout << "exception handled" << std::endl;
}
};
int main()
{
derived a; // My app crashes.
return 0;
}
Shoun't ứng dụng ghi của tôi "ngoại lệ xử lý" và tiếp tục chạy?
Giải pháp duy nhất tôi tìm thấy là bao quanh việc xây dựng "a
" trong khối thử/nắm bắt. Nhưng nếu tôi làm điều đó, điểm của việc thử/bắt trong constructor ở vị trí đầu tiên là gì? Tôi đoán có lẽ nó sử dụng là để làm sạch các biến thành viên có thể đã được phân bổ? kể từ khi destructor không được gọi?
Các công trình sau đây, nhưng xử lý ngoại lệ 2 lần.
struct base
{
base() { throw std::exception(); }
};
struct derived : public base
{
derived() try : base() { }
catch(std::exception& e)
{
std::cout << "exception 1" << std::endl;
}
};
int main()
{
// This works fine.
try {
derived a;
}
catch(std::exception& e)
{
std::cout << "exception 2" << std::endl;
}
return 0;
}
Tôi chỉ cố gắng để tự hỏi mình tại sao tôi không nên chỉ đơn giản né tránh các cú pháp try/catch cho các nhà xây dựng và viết những dòng này:
struct base
{
base() { throw std::exception(); }
};
struct derived : public base
{
derived() : base() { }
};
int main()
{
// This works fine.
try {
derived a;
}
catch(std::exception& e)
{
std::cout << "exception handled" << std::endl;
}
return 0;
}
Vì vậy, giả sử bạn là google có chính sách không sử dụng ngoại lệ và bạn đã tìm thấy thư viện thú vị, nhưng lớp bạn muốn kế thừa từ các lần ném (chỉ trong hàm tạo, không ở bất kỳ nơi nào khác). Nếu bạn kế thừa từ nó, mọi người sử dụng lớp dẫn xuất phải sử dụng try/catch everytime. Bạn sẽ làm gì trong trường hợp đó? Có vẻ như câu trả lời duy nhất là: sử dụng một thư viện khác, chỉ do constructor ... – James
@ Phantom hoặc không kế thừa từ nó, làm cho một con trỏ đến nó một thành viên và khởi tạo nó trong cơ thể constructor. Nhưng tôi tin rằng trong google họ sẽ không cho phép bạn sử dụng thư viện đó. –