2017-06-20 30 views
-3

當我在linux機器上運行這個時,我期望catch塊捕獲異常。而我得到了分段錯誤。爲什麼是這樣 ?如果它不打印「被捕獲的異常」爲什麼catch沒有處理這個錯誤C++

void handle_eptr(std::exception_ptr eptr) // passing by value is ok 
{ 
    try { 
     if (eptr) { 
      std::rethrow_exception(eptr); 
     } 
    } catch(const std::exception& e) { 
     std::cout << "Caught exception \"" << e.what() << "\"\n"; 
    } 
} 

int main() 
{ 

    char *c =(char*) 0x10; 



    std::exception_ptr eptr; 
    try { 
     std::string s = c; 

    } catch(...) { 
     std::cout<< "Caught exception"; 
     //eptr = std::current_exception(); // capture 
    } 
    // handle_eptr(eptr); 
    std::cout << "Normal Exit"; 
} 
+1

[什麼例外](http://en.cppreference.com/w/cpp/string/basic_string/basic_string)? – LogicStuff

+0

如果不打印「捕獲的異常」 – Ram

+4

您的期望是非法的地址解引用將導致C++異常。事實並非如此。你已經觸發了UB,UB可以做任何事情;包括拋出一個異常,打開一年的聖誕樹上的燈光,重新格式化硬盤,... – pm100

回答

0

您正在初始化一個與0x10,那點?你有什麼是未定義的行爲,這是幸運的與分段錯誤捕捉。 C++不需要針對這種未定義的行爲拋出異常。

分段錯誤不會引發異常。這就是爲什麼沒有被捕獲。

+0

@Ram編輯我的回答 – Curious

+0

分段故障是個例外。它只是不是C++異常,它是系統異常。 –

+0

@PetarVelev我認爲它可以安全地假設我的答案是我的意思是一個C++異常。 – Curious

5

鑑於

char *c =(char*) 0x10; 

以下行導致不確定的行爲。

std::string s = c; 

之後,你的程序的行爲可以是任何東西。在那之後嘗試理解程序的行爲是毫無意義的。

有關未定義行爲的更多信息,請參見Undefined, unspecified and implementation-defined behavior

+0

但是有一個趕上異常。我認爲它應該打印出「捕捉異常」的信息並優雅地返回 – Ram

+3

@Ram沒有任何異常可以被捕獲。 *未定義的行爲*不會引發異常 – UnholySheep

+1

@Ram,並不保證訪問內存不會導致必須拋出異常。有些平臺可能會,但那也是未定義的行爲。 –

1

您正試圖初始化std::string with a *char誰指向內存幾乎肯定不適合您的程序。 你會得到一個不是C++異常的分段錯誤,它是系統異常。 C++ try.. catch塊只捕獲C++異常。

0

異常是由throw語句引發的。隨機編碼錯誤可能會導致意外拋出異常,但這不是必需的,也不常見。

相關問題