Latest web development tutorials

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:

C ++ hirarki pengecualian

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.