2

我正在使用VC2010,並編寫以下代碼來測試「set_unexpected」函數。「set_unexpected」在VC2010中不起作用?

#include <iostream> 
#include <exception> 

void my_unexpected_handler() 
{ 
    std::cout << "unexpected handler" << std::endl; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    set_unexpected(my_unexpected_handler); 

    throw 1; 

    return 0; 
} 

然而,「my_unexpected_handler」永遠不會被調用(字符串不能打印到控制檯,我試圖設置斷點my_unexpected_handler,沒跑成)。

我的代碼有什麼問題?

感謝


對不起,我誤會了意外的異常。但是,即使我將代碼更改爲以下

#include <iostream> 
#include <exception> 

void my_unexpected_handler() 
{ 
    std::cout << "unexpected handler" << std::endl; 
} 

void func() throw(int) 
{ 
    throw 'h'; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::set_unexpected(my_unexpected_handler); 

    func(); 

    return 0; 
} 

它仍然不起作用?即,不調用「my_unexpected_handler」。

+0

這個代碼不應該被棄用甚至編譯。你需要用'std ::'限定'set_unexpected'。發佈實際的代碼。另外,如果你在'main'中,你可能正在尋找'set_terminate'。 – dirkgently

+1

注意警告:'警告C4290:除了指示函數不是__declspec(nothrow)外,忽略C++異常規範' –

回答

1

由於拋出異常的函數沒有throw規範,因此預計會發生異常。意外的異常處理程序在邏輯上足夠處理僅unexpected exceptions。沒有什麼讓這個例外意外。

3

你很可能沒有錯。您正在使用visual studio 2010,並且該編譯器不支持異常規範。那麼,它將使用它們來語法檢查代碼,但不會在運行時檢查異常類型。

看到http://msdn.microsoft.com/en-us/library/wfa0edys(v=vs.100).aspx

這通常不被視爲一個問題,因爲異常的規格通常被認爲不會是有用的,並且實際上已經在那麼C++ 11標準

相關問題