2011-08-06 8 views
20

Cân nhắc C++ mã sau:Liệu ngoại lệ được ném vào khối đánh bắt có bị chặn bởi các khối đánh bắt sau này không?

try { 
    throw foo(1); 
} catch (foo &err) { 
    throw bar(2); 
} catch (bar &err) { 
    // Will throw of bar(2) be caught here? 
} 

Tôi mong chờ câu trả lời là không vì nó không phải là bên trong khối try và tôi thấy trong một câu hỏi câu trả lời là không cho Java, nhưng muốn xác nhận C++ cũng là Không. Có, tôi có thể chạy một chương trình thử nghiệm, nhưng tôi muốn biết định nghĩa ngôn ngữ của hành vi trong trường hợp từ xa mà trình biên dịch của tôi có lỗi.

Trả lời

21

Không. Chỉ ngoại lệ được ném trong khối try được liên kết có thể bị chặn bởi khối catch.

7

Không, nó sẽ không, Một khối catch kèm theo trở lên các hệ thống phân cấp sẽ có thể bắt nó.

Ví dụ mẫu:

void doSomething() 
{ 
    try 
    { 
     throw foo(1); 
    } 
    catch (foo &err) 
    { 
     throw bar(2); 
    } 
    catch (bar &err) 
    { 
     // Will throw of bar(2) be caught here? 
     // NO It cannot & wont 
    } 
} 

int main() 
{ 
    try 
    { 
     doSomething(); 
    } 
    catch(...) 
    { 
     //Catches the throw from catch handler in doSomething() 
    } 
    return 0; 
} 
+1

nên cải thiện câu trả lời rằng 'bar (2)' sẽ bị bắt trong khối catch k trong hàm 'main()'. Điều này sẽ làm cho câu trả lời rõ ràng hơn. – zar

2

Không, một khối catch xử lý các ngoại lệ gần nhất, vì vậy nếu bạn cố gắng ... catch (Exception & exc) ... catch (SomethingDerived & derivedExc) ngoại trừ sẽ xử lý trong khối & exc

Bạn có thể đạt được các hành vi mong muốn của phái đoàn ngoại lệ đối với phương pháp gọi