Fungsi <exception>
current_exception
Mendapatkan penunjuk cerdas ke pengecualian saat ini.
exception_ptr current_exception();
Tampilkan Nilai
Objek exception_ptr menunjuk ke pengecualian saat ini.
Keterangan
current_exception
Panggil fungsi dalam blok tangkapan. Jika pengecualian dalam penerbangan dan blok tangkapan dapat menangkap pengecualian, current_exception
fungsi mengembalikan exception_ptr
objek yang mereferensikan pengecualian. Jika tidak, fungsi mengembalikan objek null exception_ptr
.
Fungsi ini current_exception
menangkap pengecualian yang sedang dalam penerbangan terlepas dari apakah catch
pernyataan menentukan pernyataan deklarasi pengecualian.
Destruktor untuk pengecualian saat ini dipanggil di akhir catch
blok jika Anda tidak menumbuhkan kembali pengecualian. Namun, bahkan jika Anda memanggil current_exception
fungsi di destruktor, fungsi mengembalikan exception_ptr
objek yang mereferensikan pengecualian saat ini.
Panggilan berturut-turut ke current_exception
objek pengembalian exception_ptr
fungsi yang merujuk ke salinan yang berbeda dari pengecualian saat ini. Akibatnya, objek membandingkan sebagai tidak sama karena merujuk ke salinan yang berbeda, meskipun salinan memiliki nilai biner yang sama.
make_exception_ptr
Membuat objek exception_ptr yang menyimpan salinan pengecualian.
template <class E>
exception_ptr make_exception_ptr(E Except);
Parameter
Kecuali
Kelas dengan pengecualian untuk disalin. Biasanya, Anda menentukan objek kelas pengecualian sebagai argumen ke make_exception_ptr
fungsi, meskipun objek kelas apa pun dapat menjadi argumen.
Tampilkan Nilai
Objek exception_ptr menunjuk ke salinan pengecualian saat ini untuk Kecuali.
Keterangan
Memanggil make_exception_ptr
fungsi setara dengan melemparkan pengecualian C++, menangkapnya di blok tangkapan, lalu memanggil fungsi current_exception untuk mengembalikan exception_ptr
objek yang mereferensikan pengecualian. Implementasi Microsoft dari make_exception_ptr
fungsi ini lebih efisien daripada melemparkan dan kemudian menangkap pengecualian.
Aplikasi biasanya tidak memerlukan make_exception_ptr
fungsi, dan kami mencegah penggunaannya.
rethrow_exception
Melempar pengecualian yang diteruskan sebagai parameter.
void rethrow_exception(exception_ptr P);
Parameter
P
Pengecualian tertangkap untuk melemparkan kembali. Jika P adalah exception_ptr null, fungsi akan melempar std::bad_exception.
Keterangan
Setelah Anda menyimpan pengecualian yang tertangkap dalam exception_ptr
objek, utas utama dapat memproses objek. Di utas utama Anda, panggil rethrow_exception
fungsi bersama dengan exception_ptr
objek sebagai argumennya. Fungsi ini rethrow_exception
mengekstrak pengecualian dari exception_ptr
objek dan kemudian melemparkan pengecualian dalam konteks utas utama.
get_terminate
Mendapatkan fungsi saat ini terminate_handler
.
terminate_handler get_terminate();
set_terminate
Menetapkan yang baru terminate_handler
untuk dipanggil pada penghentian program.
terminate_handler set_terminate(terminate_handler fnew) throw();
Parameter
fnew
Fungsi yang akan dipanggil saat penghentian.
Tampilkan Nilai
Alamat fungsi sebelumnya yang digunakan untuk dipanggil saat penghentian.
Keterangan
Fungsi ini menetapkan terminate_handler baru sebagai fungsi * fnew. Dengan demikian, fnew tidak boleh menjadi pointer null. Fungsi mengembalikan alamat handler penghentian sebelumnya.
Contoh
// 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
Mendapatkan fungsi saat ini unexpected_handler
.
unexpected_handler get_unexpected();
rethrow_if_nested
template <class E>
void rethrow_if_nested(const E& e);
Keterangan
Jika bukan jenis kelas polimorfik, atau jika nested_exception
tidak dapat diakses atau ambigu, tidak ada efek. Jika tidak, lakukan pemeran dinamis.
set_unexpected
Menetapkan baru unexpected_handler
untuk menjadi ketika pengecualian tak terduga ditemui.
unexpected_handler set_unexpected(unexpected_handler fnew) throw();
Parameter
fnew
Fungsi yang akan dipanggil ketika pengecualian tak terduga ditemui.
Tampilkan Nilai
Alamat dari sebelumnya unexpected_handler
.
Keterangan
fnew tidak boleh menjadi pointer null.
Standar C++ mengharuskan yang unexpected
dipanggil ketika fungsi melemparkan pengecualian yang tidak ada dalam daftar lemparannya. Implementasi saat ini tidak mendukung ini. Contoh berikut memanggil unexpected
secara langsung, yang kemudian memanggil unexpected_handler
.
Contoh
// 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
}
terminate
Memanggil handler penghentian.
void terminate();
Keterangan
Fungsi ini memanggil handler penghentian, fungsi jenis void
. Jika terminate
dipanggil langsung oleh program, handler penghentian adalah yang terakhir diatur oleh panggilan ke set_terminate. Jika terminate
dipanggil karena salah satu dari beberapa alasan lain selama evaluasi ekspresi lemparan, handler penghentian adalah yang berlaku segera setelah mengevaluasi ekspresi lemparan.
Handler penghentian mungkin tidak kembali ke pemanggilnya. Pada startup program, handler penghentian adalah fungsi yang memanggil abort
.
Contoh
Lihat set_unexpected untuk contoh penggunaan terminate
.
throw_with_nested
template <class T> [[noreturn]]
void throw_with_nested(T&& t);
Keterangan
Melemparkan pengecualian dengan pengecualian berlapis.
uncaught_exception
Mengembalikan hanya jika pengecualian yang dilemparkan saat ini sedang diproses true
.
bool uncaught_exception();
Tampilkan Nilai
Mengembalikan setelah menyelesaikan evaluasi ekspresi lemparan dan sebelum menyelesaikan inisialisasi true
deklarasi pengecualian di handler yang cocok atau panggilan yang tidak terduga sebagai akibat dari ekspresi lemparan. Secara khusus, uncaught_exception
akan kembali true
ketika dipanggil dari destruktor yang sedang dipanggil selama pengecualian melepas lelah. Pada perangkat, uncaught_exception
hanya didukung pada Windows CE 5.00 dan versi yang lebih tinggi, termasuk platform Windows Mobile 2005.
Contoh
// 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
tidak terduga
Memanggil handler yang tidak terduga.
void unexpected();
Keterangan
Standar C++ mengharuskan yang unexpected
dipanggil ketika fungsi melemparkan pengecualian yang tidak ada dalam daftar lemparannya. Implementasi saat ini tidak mendukung ini. Contoh memanggil unexpected
secara langsung, yang memanggil handler yang tidak terduga.
Fungsi ini memanggil handler yang tidak terduga, fungsi jenis void
. Jika unexpected
dipanggil langsung oleh program, handler yang tidak terduga adalah yang terakhir diatur oleh panggilan ke set_unexpected.
Handler tak terduga mungkin tidak kembali ke pemanggilnya. Ini dapat mengakhiri eksekusi dengan:
Melempar objek jenis yang tercantum dalam spesifikasi pengecualian atau objek dari jenis apa pun jika handler yang tidak terduga dipanggil langsung oleh program.
Melempar objek jenis bad_exception.
Panggilan dihentikan,
abort
atauexit
.
Pada startup program, handler tak terduga adalah fungsi yang memanggil dihentikan.
Contoh
Lihat set_unexpected untuk contoh penggunaan unexpected
.