C ++ exception handling
Pengecualian adalah masalah prosedural yang timbul selama eksekusi. C ++ pengecualian mengacu terjadi khusus ketika program ini berjalan, seperti upaya untuk membagi dengan nol operasi.
Pengecualian diberikan dengan cara mentransfer kontrol program. C ++ penanganan eksepsi melibatkan tigakata kunci: coba, menangkap, melempar.
- membuang: Ketika masalah muncul, program ini akan melempar pengecualian.Hal ini dilakukan dengan menggunakan kata kuncithrow untuk menyelesaikan.
- menangkap: di mana Anda ingin berurusan dengan masalah, pengecualian tertangkap oleh handler pengecualian.menangkap kata kunci digunakan untuk menangkap pengecualian.
- coba: cobakode blok mengidentifikasi pengecualian tertentu diaktifkan. Di balik itu biasanya diikuti oleh satu atau lebih blok catch.
Jika ada blok melempar pengecualian, menangkap metode pengecualian menggunakanmencoba dan kata kunci catch.mencoba menempatkan blok kode mungkin melemparkan pengecualian, coba kode blok dikenal sebagai kode-dilindungi. Gunakan mencoba / menangkap sintaks pernyataan adalah sebagai berikut:
try { // 保护代码 }catch( ExceptionName e1 ) { // catch 块 }catch( ExceptionName e2 ) { // catch 块 }catch( ExceptionName eN ) { // catch 块 }
Jika Andamencoba blok dalam konteks yang berbeda akan melempar pengecualian yang berbeda, kali ini Anda dapat mencoba untuk daftar beberapa laporan menangkapuntuk menangkap berbagai jenis pengecualian.
Melemparkan pengecualian
Anda dapat menggunakan pernyataanthrow di mana saja di blok kode melempar pengecualian.melempar pernyataan operan dapat menjadi semua jenis ekspresi hasil dari ekspresi menentukan jenis pengecualian dilemparkan.
Berikut ini adalah pengecualian Coba nol dibagi dengan contoh:
double division(int a, int b) { if( b == 0 ) { throw "Division by zero condition!"; } return (a/b); }
Menangkap pengecualian
catch blok di belakang blok mencobauntuk menangkap pengecualian. Anda dapat menentukan jenis pengecualian Anda ingin menangkap, yang dinyatakan oleh pengecualian dalam tanda kurung setelah keputusan menangkap kata kunci.
try { // 保护代码 }catch( ExceptionName e ) { // 处理 ExceptionName 异常的代码 }
Kode di atas akan menangkap pengecualian jenisExceptionName.Jika Anda ingin menangkap blok dapat menangani jenis pengecualian dilemparkan blok try, Anda harus menggunakan pengecualian dalam kurung elipsis ... pernyataan, sebagai berikut:
try { // 保护代码 }catch(...) { // 能处理任何异常的代码 }
Berikut adalah contoh dari pembagian dengan nol melempar pengecualian, dan pengecualian tertangkap di blok catch.
#include <iostream> using namespace std; double division(int a, int b) { if( b == 0 ) { throw "Division by zero condition!"; } return (a/b); } int main () { int x = 50; int y = 0; double z = 0; try { z = division(x, y); cout << z << endl; }catch (const char* msg) { cerr << msg << endl; } return 0; }
Karena kita membuang jenisconst char * pengecualian, karena itu, ketika menangkap bahwa pengecualian, kita harus menggunakan const char * di blok catch.Ketika kode di atas dikompilasi dan dijalankan, menghasilkan hasil sebagai berikut:
Division by zero condition!
C ++ pengecualian standar
C ++ menyediakan satu set pengecualian standar yang ditetapkan di<exception>, kita dapat menggunakan pengecualian standar dalam program ini.Mereka didasarkan pada hirarki kelas induk-anak disusun sebagai berikut:
Tabel berikut adalah deskripsi dari masing-masing hirarki di atas tampak abnormal:
异常 | 描述 |
---|---|
std::exception | 该异常是所有标准 C++ 异常的父类。 |
std::bad_alloc | 该异常可以通过new抛出。 |
std::bad_cast | 该异常可以通过dynamic_cast抛出。 |
std::bad_exception | 这在处理 C++ 程序中无法预期的异常时非常有用。 |
std::bad_typeid | 该异常可以通过typeid抛出。 |
std::logic_error | 理论上可以通过读取代码来检测到的异常。 |
std::domain_error | 当使用了一个无效的数学域时,会抛出该异常。 |
std::invalid_argument | 当使用了无效的参数时,会抛出该异常。 |
std::length_error | 当创建了太长的 std::string 时,会抛出该异常。 |
std::out_of_range | 该异常可以通过方法抛出,例如 std::vector 和 std::bitset<>::operator[]()。 |
std::runtime_error | 理论上不可以通过读取代码来检测到的异常。 |
std::overflow_error | 当发生数学上溢时,会抛出该异常。 |
std::range_error | 当尝试存储超出范围的值时,会抛出该异常。 |
std::underflow_error | 当发生数学下溢时,会抛出该异常。 |
Mendefinisikan pengecualian baru
Anda dapat menentukan pengecualian baru oleh warisan kelaspengecualian dan overloading.Contoh berikut menunjukkan bagaimana menggunakan kelas std :: exception untuk menerapkan pengecualian mereka sendiri:
#include <iostream> #include <exception> using namespace std; struct MyException : public exception { const char * what () const throw () { return "C++ Exception"; } }; int main() { try { throw MyException(); } catch(MyException& e) { std::cout << "MyException caught" << std::endl; std::cout << e.what() << std::endl; } catch(std::exception& e) { //其他的错误 } }
Ini menghasilkan hasil sebagai berikut:
MyException caught C++ Exception
Di sini, metode apa () adalah kelas pengecualian publik asalkan telah kelebihan beban semua kelas sub pengecualian.Ini akan kembali penyebab pengecualian ini dihasilkan.