Tôi không chắc liệu đây có phải là vấn đề với trình biên dịch hay không nếu tôi làm sai điều gì đó. Tôi đang sử dụng trình biên dịch Visual Studio 2013.Constructor là một khối thử chức năng - Ngoại lệ hủy bỏ chương trình
Tôi có một lớp mà tôi cần để có được số lượng đáng kể tài nguyên trong danh sách khởi tạo hàm dựng của tôi, hầu hết trong số đó có thể ném một ngoại lệ. Tôi bọc danh sách initializer thành viên trong một khối thử chức năng và bắt được ngoại lệ ở đó. Nhưng chương trình của tôi vẫn hủy bỏ mặc dù điều khoản bắt không tái ném ngoại lệ. Tôi không được phép đăng mã thực tế. Vì vậy, tôi đã sao chép vấn đề với mã demo tương đương này. Ai đó có thể giúp tôi giải quyết vấn đề này không?
#include <iostream>
using namespace std;
class A{
public:
A() try : i{ 0 }{ throw 5; }
catch (...){ cout << "Exception" << endl; }
private:
int i;
};
int main(){
A obj;
}
Khi thực thi mã này, tôi nhận được cảnh báo cửa sổ "hủy bỏ() đã được gọi". Vì vậy, tôi đoán hệ thống đang xử lý điều này như là một ngoại lệ không bị bắt và gọi chấm dứt().
Mặt khác, nếu tôi bọc cấu trúc của đối tượng trong chính() trong khối try-catch thì ngoại lệ sẽ bị bắt đúng và chương trình kết thúc bình thường.
Ai đó có thể vui lòng cho tôi biết nếu tôi đang làm điều gì sai ở đây?
nhìn vào http://www.gotw.ca/gotw/066.htm cho một cuộc thảo luận về vấn đề này –
Cảm ơn bạn rất nhiều Jan Herrmann. Nó rõ ràng làm cho rất nhiều ý nghĩa cho các tiêu chuẩn để nói rằng nếu một ngoại lệ không được rethrown hoặc nếu một esception mới không được ném từ chức năng thử khối của constructor sau đó nó sẽ được tự động rethrown ở phần cuối của catch khối. Điều này làm cho cảm giác hoàn hảo ngay bây giờ. Có lẽ như đề nghị thành ngữ pimpl là những gì tôi nên bắt đầu sử dụng. Cảm ơn rất nhiều lần nữa – Madhusudhan
Điểm bổ sung cho * “Tôi không được phép đăng mã thực tế. Vì vậy, tôi đã sao chép vấn đề với mã demo tương đương này. ”* Bạn đã thực hiện một [MCVE] rất tốt (https://stackoverflow.com/help/mcve). – 5gon12eder