2009-06-11 28 views
11

在C++中throw;在catch塊中執行時,會在塊之外重新拋出當前捕獲的異常。如果扔了會發生什麼;語句在catch塊之外執行?

this answer異常調度的想法使用複雜的異常處理時,往往就被當作一個解決方案來減少重複代碼:

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; 
    } 
} 

投擲指針或值不作任何區別所以它的出的問題。

如果ExceptionHandler()不是從catch塊中調用會發生什麼?

我想這個代碼VC7:

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

首先,它使得調試器指示第一次機會異常,然後立即未處理的異常。如果我在調試器外部運行此代碼,程序崩潰的方式與調用abort()相同。

這種情況下的預期行爲是什麼?

+0

刪除了「windows」標籤,因爲這與Windows沒有任何關係(但IS是一個很好的問題)。 – 2009-06-11 15:23:01

回答

23

從標準,15.1/8

如果沒有例外當前被處理,執行擲表達無操作數調用std::terminate()。

+0

只因爲a)你打我,b)你引用標準我會刪除我的(幾乎)重複的答案 – Glen 2009-06-11 14:30:58

相關問題