<exception>函式</exception>
如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件。
current_exception | get_terminate | get_unexpected |
make_exception_ptr | rethrow_exception | set_terminate |
set_unexpected | 終止 | uncaught_exception |
非預期 |
current_exception
取得目前例外狀況的智慧型指標。
exception_ptr current_exception();
傳回值
Exception_ptr指向目前例外狀況物件。
備註
在 catch 區塊中呼叫 current_exception
函式。 如果例外狀況正在進行中,而且 catch 區塊可以攔截例外狀況,則 current_exception
函式會傳回參考例外狀況的 exception_ptr
物件。 否則,函式會傳回 Null exception_ptr
物件。
current_exception
函式會擷取的狀況,而不論是否正在進行中的例外狀況catch
陳述式會指定例外狀況宣告陳述式。
若不重新擲回例外狀況,則會在 catch
區塊結尾呼叫目前例外狀況的解構函式。 不過,即使您呼叫current_exception
函式在解構函式,則函數會傳回exception_ptr
物件參考目前例外狀況。
current_exception
函式的後續呼叫會傳回參考目前例外狀況不同複本的 exception_ptr
物件。 因此,物件比較結果會是不相等,因為兩者參考不同的複本 (即使複本的二進位值相同也一樣)。
make_exception_ptr
建立exception_ptr保存一份例外狀況物件。
template <class E>
exception_ptr make_exception_ptr(E Except);
參數
Except
具有待複製例外狀況的類別。 通常,您指定例外狀況類別物件做為引數make_exception_ptr
函式中,雖然任何類別物件是引數。
傳回值
Exception_ptr物件,指向目前例外狀況複本Except
。
備註
呼叫make_exception_ptr
函式相當於擲回 c + + 例外狀況,攔截在 catch 區塊中,然後呼叫current_exception函數來傳回exception_ptr
物件參考該例外狀況。 Microsoft 實作make_exception_ptr
函式比在擲回例外狀況之後攔截來得更有效率。
一般來說,應用程式通常不需要使用 make_exception_ptr
函式,所以我們不建議使用此功能。
rethrow_exception
擲回做為參數傳遞的例外狀況。
void rethrow_exception(exception_ptr P);
參數
P
要重新擲回的已攔截例外狀況。 如果P
是 null exception_ptr,函式會擲回std:: bad_exception。
備註
將攔截到的例外狀況儲存在 exception_ptr
物件之後,主執行緒即可處理物件。 在主執行緒中呼叫 rethrow_exception
函式,並使用 exception_ptr
物件做為其引數。 rethrow_exception
函式會從 exception_ptr
物件擷取例外狀況,然後在主執行緒的內容中擲回該例外狀況。
get_terminate
取得目前的 terminate_handler
函式。
terminate_handler get_terminate();
set_terminate
建立新 terminate_handler
,在程式終止時呼叫。
terminate_handler set_terminate(terminate_handler fnew) throw();
參數
fnew
要在終止時呼叫的函式。
傳回值
先前用來在終止時呼叫的函式的位址。
備註
函式會建立新terminate_handler為函式 * fnew
。 因此,fnew
不能是 null 指標。 此函數會傳回先前的位址終止處理常式。
範例
// exception_set_terminate.cpp
// compile with: /EHsc
#include <exception>
#include <iostream>
using namespace std;
void termfunction()
{
cout << "My terminate function called." << endl;
abort();
}
int main()
{
terminate_handler oldHandler = set_terminate(termfunction);
// Throwing an unhandled exception would also terminate the program
// or we could explicitly call terminate();
//throw bad_alloc();
terminate();
}
get_unexpected
取得目前的 unexpected_handler
函式。
unexpected_handler get_unexpected();
set_unexpected
建立新的 unexpected_handler
,當未預期的例外狀況發生時擲回。
unexpected_handler set_unexpected(unexpected_handler fnew) throw();
參數
fnew
發生未預期的例外狀況時要呼叫函式。
傳回值
先前的位址unexpected_handler
。
備註
fnew
不能是 null 指標。
C + + 標準要求unexpected
函式會擲回的例外狀況,不會擲回清單時,會呼叫。 目前的實作不支援此。 下列範例會呼叫unexpected
直接,然後呼叫unexpected_handler
。
範例
// exception_set_unexpected.cpp
// compile with: /EHsc
#include <exception>
#include <iostream>
using namespace std;
void uefunction()
{
cout << "My unhandled exception function called." << endl;
terminate(); // this is what unexpected() calls by default
}
int main()
{
unexpected_handler oldHandler = set_unexpected(uefunction);
unexpected(); // library function to force calling the
// current unexpected handler
}
終止
呼叫終止處理常式。
void terminate();
備註
函式會呼叫終止處理常式,類型的函式void
。 如果終止會直接呼叫終止處理常式的程式最新設定的呼叫所set_terminate。 如果終止呼叫任何其他原因 throw 運算式的評估期間,終止處理常式就是作用中後立即評估 throw 運算式。
終止處理常式不會傳回至呼叫端。 在程式啟動時,終止處理常式會呼叫的函數,中止。
範例
請參閱set_unexpected的使用範例終止。
uncaught_exception
傳回true
只有當正在處理擲回的例外狀況。
bool uncaught_exception();
傳回值
傳回true
完成評估 throw 運算式以及前完成的例外狀況中的宣告相符的處理常式或呼叫初始化之後預期throw 運算式的結果。 特別是,uncaught_exception
會傳回true
從例外狀況回溯期間叫用解構函式呼叫時。 在裝置上, uncaught_exception
Windows CE 5.00 或更新版本,包括 Windows Mobile 2005 平台上才支援。
範例
// exception_uncaught_exception.cpp
// compile with: /EHsc
#include <exception>
#include <iostream>
#include <string>
class Test
{
public:
Test( std::string msg ) : m_msg( msg )
{
std::cout << "In Test::Test(\"" << m_msg << "\")" << std::endl;
}
~Test( )
{
std::cout << "In Test::~Test(\"" << m_msg << "\")" << std::endl
<< " std::uncaught_exception( ) = "
<< std::uncaught_exception( )
<< std::endl;
}
private:
std::string m_msg;
};
// uncaught_exception will be true in the destructor
// for the object created inside the try block because
// the destructor is being called as part of the unwind.
int main( void )
{
Test t1( "outside try block" );
try
{
Test t2( "inside try block" );
throw 1;
}
catch (...) {
}
}
In Test::Test
("outside try block")
In Test::Test
("inside try block")
In Test::~Test
("inside try block")
std::uncaught_exception
( ) = 1
In Test::~Test
("outside try block")
std::uncaught_exception
( ) = 0
非預期
呼叫未預期的處理常式。
void unexpected();
備註
C + + 標準要求unexpected
函式會擲回的例外狀況,不會擲回清單時,會呼叫。 目前的實作不支援此。 範例會呼叫unexpected
直接呼叫非預期的處理常式。
函式呼叫的非預期的處理常式類型的函式void
。 如果unexpected
會直接呼叫程式,也就是預期的處理常式最新設定的呼叫所set_unexpected。
預期的處理常式不會傳回至呼叫端。 它可能會終止執行︰
擲回的物件,如果預期的處理常式會直接呼叫程式例外狀況規格或任何類型的物件中所列出的類型。
擲回型別的物件bad_exception。
Calling terminate, abort or exit(
int
).
在程式啟動時,預期的處理常式會呼叫的函數,終止。
範例
請參閱set_unexpected的使用範例意外。