1

當函數拋出異常時,標準行爲不在有效異常列表中時是什麼標準行爲?例如,當我運行此代碼:C++異常規範 - 處理無效異常

#include <iostream> 
#include <cstdlib> 

using namespace std; 

void NotLegal() throw(char) { 
    throw 42; 
} 

void myunexpected() { 
    cout << "exception not in list\n"; 
    cin.get(); 
    exit(0); 
} 

int main() 
{ 
    set_unexpected(myunexpected); 

    try { 
     NotLegal(); 
    } 
    catch(...) { 
     cout << "exception catched"; 
     cin.get(); 
    } 

    return 0; 
} 

它的行爲在不同的GCC和Visual Studio C++編譯器:

  • 2010年VS預計不會異常一般異常處理程序捕獲。
  • 在GCC unexpected()處理函數被調用而不是捕獲異常。

這是什麼區別?爲什麼MS C++編譯器不會調用unexpected()回調?

+1

您是否嘗試更改您的示例?只是爲了確保你不會在42和char之間自動轉換。只需嘗試throw()而不是throw(char)。 –

+0

這與空例外列表相同。 –

回答

3

The documentationset_unexpected召喚出這種行爲:

備註

...

C++標準要求,當一個函數拋出unexpected被稱爲不在其投擲列表中的例外。目前的實施不支持這一點。

1

你編譯了正確的標誌嗎?對於某些優化版本構建,Visual Studio默認沒有啓用異常處理。

你想/c and /EHsc

+3

鏈接到的文檔說* C++標準要求當函數拋出一個不在其拋出列表中的異常時調用意外。 **目前的實現不支持這個**。* –

+0

我懷疑VS C++沒有實現。你能把這個寫成單獨的答案嗎? –