2012-07-20 26 views
12
class A{ 
    public: 
     A() { throw string("exception A"); }; 
}; 

class B{ 
    A a; 
    public: 
     B() try : a() {} catch(string& s) { cout << &s << " " << s << endl; }; 
}; 

int main(){  
    try{ 
     B b; 
    }catch(string& s){ 
     cout << &s << " " << s << endl; 
    } 
    return 0; 
} 

Đầu ra là:ngoại lệ được bắt hai lần

0x32c88 exception A 
0x32c88 exception A 

Kể từ khi ngoại lệ đã được bắt gặp trong các nhà xây dựng của B, tại sao nó vẫn xảy ra trong hàm main?

Trả lời

21

Khi dòng chảy của contol đến cuối của trình xử lý cho một khối chức năng thử của một hàm tạo, ngoại lệ bị bắt sẽ tự động được ném lại.

Bạn không thể chặn một ngoại lệ được ném trong khi xây dựng một lớp cơ sở hoặc thành viên trong một hàm tạo lớp dẫn xuất vì điều này sẽ dẫn đến một đối tượng có nguồn gốc được xây dựng với cơ sở hoặc thành viên không được xây dựng.

GOTW này có liên quan: http://www.gotw.ca/gotw/066.htm

Từ ISO/IEC 14882: 2011 15.3 [except.handle]/15:

Ngoại lệ hiện xử lý được rethrown nếu kiểm soát đạt đến cuối một handler của chức năng-try-block của một hàm tạo hoặc hàm hủy. [...]

Các vấn đề liên quan