2015-06-17 74 views
1

最近我試圖在C++一個簡單的異常程序,它是這樣劃分的: -異常捕獲爲INT 0

#include <iostream> 
#include <exception> 
#include <stdexcept> 
using namespace std; 
int main() 
{ 
    int x=5, y=0; 
    try 
    { 
     int z=x/y; 
     cout<<"z="<<z; 
    } 
    catch (exception& e) 
    { 
     cout<<"exception caught: "<<e.what(); 
    } 
    return 0; 
} 

爲什麼也不例外這裏拋出?代碼中有什麼錯誤? 另外我想知道爲什麼&需要捕捉異常?

回答

10

任何除以零的整數在標準C++中都不是例外。

的部分C++ 5.6規定:

如果/或%所述第二操作數是零,則該行爲是未定義的。

您也可能會發現有趣的閱讀這樣的:

斯特勞斯說,在「設計與++的C進化」(艾迪生韋斯利, 1994年),「低級別的事件,如算術溢出併除以 爲零,假定由專用的底層機制 而不是由異常處理,這使得C++在涉及算術時能夠匹配其他語言的行爲,並且還避免了 問題發生在嚴重流水線架構上,其中事件 如除以零是異步「`

+2

這是真正有價值的!萬分感謝 ! –

+0

@AnkitAcharya: - 不客氣! –

2

在C++中,被零除是未定義的行爲 - 它不會引發異常。

從C++標準(第5章,表達式)的最近的工作草案中,關於未數學上定義的表達式:

如果表達式的評估過程中,其結果是不數學定義或者不在其類型的可表示值範圍內,則行爲是未定義的。

3

對於第二個問題: 我們通過引用(&)捕捉異常因爲多態類型只能充當‘通過指針或參考多態’。例外是多態類型,因爲我們可以有多個派生自我們想要一般捕獲的std::exception的類。

由於按照慣例,我們通過值拋出異常,只有引用可以在catch站點工作。

+0

感謝您對此評論 –

+0

如果您不打算修改它,最好是通過'const&'捕獲異常 –

+0

@AndyT當然,這樣會更好,但不知何故,人們大多數時間都不會去做異常。 事實上,我很驚訝我們可以通過非const引用來捕獲異常,因爲異常並不是真正的左值 – KABoissonneault

0

除以0是未定義在C++中,因此,所有你能做的就是拋出和捕捉異常: -

int main() 
{ 
int x=5, y=0, z=1; 
try 
{ 
    if (y==0) 
    throw y; 
    else 
    z=x/y; 
    cout<<z; 
} 
catch (int) 
{ 
    cout<<"division by zero error"; 
} 
return 0; 
} 
+3

這有UB。你必須在分割之前扔掉。 – bolov

+0

不,先生,我試過的代碼,由她給出,它工作得很好 –

2

沒有例外,在你的代碼拋出,並沒有異常捕獲。

你可以拋出,如果y == 0異常,捕獲它的catch塊:

try 
{ 
    if (y == 0) throw(string("Divide by zero not allowed")); 
    int z=x/y; 
    cout<<"z="<<z; 
} 
catch (const string &e) 
{ 
    cout << "exception caught: "<< e; 
} 

我們不需要趕引用異常,但它是首選。

由於我們在拋出一個字符串,我們也需要捕獲一個字符串。

我們也可以拋出一個字符串文字,抓住它:

try 
{ 
    if (y == 0) throw("Divide by zero not allowed"); 
    int z=x/y; 
    cout<<"z="<<z; 
} 
catch (const char* e) 
{ 
    cout << "exception caught: "<< e; 
} 
+0

我會建議不要拋出通用對象和內置類型。儘管C++確實允許,但傳統的行爲是使用從'std :: exception'派生的異常類,例如['std :: domain_error'](http://en.cppreference.com/w/cpp/error/定義域)。 – sjdowling