2009-06-11 40 views
11

Trong C++ throw; khi được thực thi bên trong khối catch, hãy giữ lại ngoại lệ hiện đang bị bắt bên ngoài khối.Điều gì xảy ra nếu ném; câu lệnh được thực hiện bên ngoài khối catch?

Trong this answer một ý tưởng về ngoại lệ phối được đưa lên như một giải pháp để giảm sự trùng lặp mã khi sử dụng xử lý ngoại lệ phức tạp thường:

try { 
    CodeThatMightThrow(); 
} catch(...) { 
    ExceptionHandler(); 
} 

void ExceptionHandler() 
{ 
    try { 
     throw; 
    } catch(FileException* e) { 
     //do handling with some complex logic 
     delete e; 
    } catch(GenericException* e) { 
     //do handling with other complex logic 
     delete e; 
    } 
} 

Ném một con trỏ hoặc một giá trị không thực hiện bất kỳ sự khác biệt do đó, nó ra của câu hỏi.

Điều gì sẽ xảy ra nếu ExceptionHandler() được gọi không phải từ khối catch?

Tôi đã thử mã này với VC7:

int main(int, char**) 
{ 
    try { 
     throw; 
    } catch(...) { 
     MessageBox(0, "", "", 0); 
    } 
    return 0; 
} 

Đầu tiên nó làm cho debugger để chỉ ra một ngoại lệ đầu tiên có cơ hội, sau đó ngay lập tức một ngoại lệ unhandled. Nếu tôi chạy mã này bên ngoài trình gỡ rối, chương trình sẽ bị treo giống như cách hủy bỏ() đã được gọi.

Hành vi mong đợi cho các tình huống như vậy là gì?

+0

Thẻ "cửa sổ" bị xóa vì điều này không liên quan gì đến Windows (nhưng là một câu hỏi hay). –

Trả lời

23

Từ Standard, 15,1/8

Nếu không có ngoại lệ được hiện đang được xử lý, thực hiện một ném biểu hiện không có toán hạng gọi std::terminate().

+0

Chỉ vì một) bạn đánh tôi với nó, và b) bạn trích dẫn tiêu chuẩn tôi sẽ xóa câu trả lời trùng lặp (gần như) của tôi – Glen

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