2014-02-14 62 views
2

我在Ubuntu 12.04中使用了eclipse。我在我的程序中使用了一些例外情況,當它們被抓到時,它給我正確的答案。但該計劃持續到最後。有異常後停止程序的方法嗎?程序不會異常後停止

這是我使用的代碼:

try{ 
     if(BLER==-1) throw 12; 
    }catch(int exception){ 
     cout << "ERROR: BLER value is invalid for x= " << x << ", BLER_input= " << BLER_input << ", m= "<< m << endl; 
    } 
+0

爲什麼不盡早'返回'? – Proxy

+0

return;或退出(); ? –

+0

'catch'旨在在異常成功捕獲後讓程序繼續運行。您可以直接在'catch'塊中調用'abort()'或'exit()'。 –

回答

2

一些解決方案:

  1. 使用return從你的函數(和做相應的你的返回值),如果你在做這個該main()例程

  2. 使用exit(n)其中n是退出代碼(http://www.cplusplus.com/reference/cstdlib/exit/

  3. abort()如果這是一個關鍵的問題(http://www.cplusplus.com/reference/cstdlib/abort/

通知:由詹姆斯·甘孜,exitabort指出將調用本地對象的析構函數。這是值得注意的,因爲你正在處理類。

+0

我正在使用從一個主類使用的內部。我認爲exit(n)和abort會更好。謝謝!!! – Shahab

+0

如果您使用退出,請記住,如果退出代碼爲0或EXIT_SUCCESS,則表示成功。否則失敗。 –

+1

@DavidKernin這取決於實施。 '0'或'EXIT_SUCCESS'表示成功,'EXIT_FAILURE'表示失敗,其他任何事情都是實現定義的。 (至少有一個公共系統要求返回代碼的範圍是0 ... 255。) –

1

使用功能退出:exit(1);,其中1是出射碼(通常爲非零信號錯誤)。如果您認爲例外是嚴重錯誤,您也可以使用abort()

0

嘗試使用命令return這樣

return 0 //for successful termination or your preffered int status returned 
//or just 
return; 
//or (C++) 
[std::exit] 
0

要捕獲異常後停止執行程序,只需調用std::exit()catch塊:

#include <cstdlib> 
#include <iostream> 

int main() 
try 
{ 
    throw 42; 
} 
catch(int i) 
{ 
    std::cout << "Caught int: " << i << ". Exiting...\n"; 
    std::exit(EXIT_FAILURE); 
} 

Live demo here

這也適用於main之外。您可以用EXIT_FAILURE替換您想要的任何int值,portably in the 0-255 range

+0

可移植的,也許,但你不一定會得到你期望的結果。過去,至少有一個共同的系統把所有的偶數值都視爲失敗,除了0以外) –

+0

@James可移植的就像在「Windows和POSIX」中一樣,這是一個相當包容的定義,其他系統非常特殊,它們在「便攜式「意義 – rubenvb

+0

我不知道這一點IBM大型機仍然很普遍,但大多數現代系統雖然不一定是Posix,但它確實在某種程度上模擬了Unix接口(可能大多數實際系統都是嵌入並運行n無論是Windows還是Unix,但大多數人不會爲這些系統編程。) –

2

如果可以/必須在當前函數處理這個問題,你可以(也應該)終止權有:

#include <iostream> 
#include <cstdlib> 

if (BLER == -1) 
{ 
    std::cout << "BLER value is invalid." << std::endl; 
    std::exit(EXIT_FAILURE); 
} 

例外意味着,當你有一個錯誤的條件被拋出,但不知道如何正確處理它。在這種情況下,你拋出一個異常代替的整數,可選給予在其構造中遇到的問題的指示......

#include <stdexcept> 

if (BLER == -1) 
{ 
    throw std::runtime_exception("BLER value is invalid"); 
} 

...並趕上地方調用樹,其中你可以給出更好的錯誤信息,可以處理問題,重新拋出,或者根據你的選擇終止)。如果程序沒有被捕獲(「未處理的異常」),則異常只會終止程序。這就是構造的整個想法。

拋出一個整數並在同一函數中捕獲它是(ab-)使用異常作爲函數goto

0

C++中的catch處理程序允許我們處理代碼正常執行路徑之外的錯誤。一旦處理完畢,C++認爲恢復正常操作或程序是安全的。

如果情況並非如此,假設您只是想記錄錯誤,那麼您可以免費重置導致錯誤在堆棧中進一步傳播的異常。

如果異常沒有被捕獲,C++函數std::terminate將被調用。默認行爲是調用abort

可能是你做的最好的事情你的情況是通過在catch塊的末尾調用throw來重新拋出這種懷疑。