2012-02-05 71 views
1

我做了一個類來嘗試例外:異常不中斷的指令流

class precExcp:exception 
{ 
    public: 
    virtual const char* what() 
    { 
     return "Precision must be positive"; 
    } 
}; 

的問題是,當一個異常被推出,說明流動不會停止。 我不知道這是C++的默認行爲。 如果是,如果我想在發生異常時中斷指令流程,該怎麼辦? 這是我在主做了一個例子:

int main(int argc, char **argv) 
{ 
    try 
    { 
     if(1) 
      throw precExcp(); 
    } 
    catch(precExcp& e) 
    { 
     cerr << e.what() <<endl; 
    } 
    cout << "hello" <<endl; 
} 

在打印的「你好」字符串屏幕,是正常的嗎?如何避免這種情況?

+1

請務必做'class precExcp:public exception' – 2012-02-05 23:55:34

+1

您是否嘗試在catch內部返回? – George 2012-02-05 23:57:42

回答

1

基於我可以從你的問題明白了,如果你想在「你好」輸出跳過,把它放在try塊中。

try 
{ 
    if(1) 
     throw precExcp(); // throwing here will skip all remaining 
         // instructions in the try block 
    cout << "hello" <<endl; 
} 
catch(precExcp& e) 
{ 
    cerr << e.what() <<endl; 
} 

另請注意,這不是Java或Python。 C++異常處理通常不需要你定義或捕獲太多不同的異常類型,因爲你的主要恢復源將是析構函數(@see RAII),它經常消除了需要多個catch分支(如以及最後的塊)。通常你只需要捕獲const std :: exception &(使precExcp成爲它的一個子類),只有在極少數情況下,你需要更多的粒度檢查。

您也可以再次拋出:

try 
{ 
    if(1) 
     throw precExcp(); // throwing here will skip all remaining 
         // instructions in the try block 
} 
catch(precExcp& e) 
{ 
    cerr << e.what() <<endl; 
    throw; // throw the original exception 
} 

但是,如果你這樣做的主,沒有catch塊,以趕上第二擲,它會與未處理的異常可能會或可能不會崩潰什麼你在尋找。

4

如果發現異常,則認爲該異常已處理,並在try/catch塊的末尾恢復執行。

如果你想要異常繼續往上鍊進一步(以及可能導致程序中止,如果它沒有被捕獲),然後添加一個throwcatch

catch(precExcp& e) 
{ 
    cerr << e.what() <<endl; 
    throw; 
} 

如果你想在那裏暫停程序而不是向上傳播異常或讓執行恢復,您可以撥打exit(或return在這種情況下,但僅因爲您在main)。

+0

哦,對,很蠢:) – 2012-02-06 00:02:36

1

是的,這是正常的:你陷入catch塊異常,所以異常不會在try/catch - 塊在其被上調外傳播。

0

這是正常的行爲,你的不穩定代碼放置在try塊,當事情走了不喜歡那麼應該執行catch塊時,你可以處理異常,這個過程後,您可以使用可選的finally塊,它try之後調用成功並在catch後失敗。代碼正常執行後,代碼執行僅在try塊中停止,當需要停止執行此功能時(catch塊中),需要return

0

那麼,你發現拋出的異常,所以這是正常的。把代碼的一部分,你不想執行,如果try塊內發生了異常:

try { 
    throw precExcp(); 
    cout << "hello" <<endl; 
} 
catch(precExcp &e) { 
    // ... 
}