2010-09-30 55 views
1

我只是在視覺工作室和上面的代碼中玩弄異常,因爲我的異常規範沒有提到任何應該引發的錯誤提示。但實際發生的情況是異常被適當的處理程序捕獲。爲什麼這樣?我是否缺少一些設置或IDE中的某些內容?關於異常的問題

雖然我被困在上面提到的,其實我試圖找到問題的答案,如果我有一個異常空白規範然後會被調用? 的意外()方法或* bad_exception *將被拋出,如果兩者以什麼順序? 這是代碼。

#include "stdafx.h" 
#include <stdio.h> 
#include <exception> 
#include <iostream> 


using namespace std; 

class A 
{ 
    public: 
     int i; 
}; 

void myunexpected() 
{ 
    cerr << "unexpected called\n"; 
} 

void doSomething(void) throw(); 
void doSomething(void) throw() 
{ 
    A obj; 
    obj.i= 100; 
    throw obj; 
} 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    set_unexpected (myunexpected); 
    try 
    { 
     doSomething(); 
    } 
    catch (bad_exception be) 
    { 
     puts("Caught something"); 
    } 
    catch (A &obj) 
    { 
     puts("Caught Integer"); 
    } 
    return 0; 
} 
+0

darn!我可以看到代碼在預覽中正確對齊,但不在這裏! :( – 2010-09-30 07:51:35

+0

使用編輯器上方的'101010'按鈕來格式化代碼 – sbi 2010-09-30 07:58:45

+0

@sbi:謝謝!應該嘗試一下按鈕。我試過實際上我使用了代碼和prev標籤,並且在預覽中奇怪地顯示了正確的縮進但不是post::( – 2010-09-30 08:03:51

回答

6

關於異常規範,Visual Studio不符合標準。

儘管空的異常規範有些用處(但是,如上所述,VS沒有正確實現),但通常異常規範被視爲an experiment that failed

+0

)謝謝!我並沒有意識到這一點,但通常我從來沒有使用過異常規範。我腦海中的實際Q值並不是那麼好。 – 2010-09-30 08:23:48

1

基本上,異常規範幾乎是無用的,並且在許多編譯器實現的標準狀態不同。查看您的編譯器文檔以獲取更多信息。

http://msdn.microsoft.com/en-us/library/wfa0edys(VS.80).aspx

我可以想像,這尤其意味着該VS編譯器將使用異常規範,以避免產生所需的堆棧展開,並在實際上被拋出,你會落得一個異常的事件代碼未定義的行爲。