Mengenal Exception Handling pada C++ - nblognlife

Mengenal Exception Handling pada C++

Contoh Program Exception Handling pada C++

     Pada bahasa pemrograman C++, terdapat suatu metode yang dinamakan Exception Handling. Exception handling ini digunakan untuk menangani error atau keadaan tertentu yang terjadi ketika program sedang berjalan. Ketika terjadi error saat program berjalan (runtime error) program akan mengarahkan alur eksekusi program ke fungsi khusus yang dinamakan handler. Namun jika tidak terjadi error yang menyebabkan exception maka semua handler akan diabaikan dan program dijalankan secara normal.

      Dengan menggunakan exception handling akan memudahkan programmer untuk memisahkan blok kode untuk menangani kesalahan dengan blok kode inti dari program. Hal tersebut tentunya juga akan membuat kode program menjadi rapi dan mudah untuk dibaca.

Terdapat tiga keyword yang digunakan pada Exception Handling C++, yaitu try, catch, dan throw.

Bentuk penulisan exception handling c++ :
try
{
            //code pada try
}
catch(namaexception1/tipe e1)
{
            //code pada catch
}
catch(namaexception2/tipe e2)
{
            //code pada catch
}

Untuk mengetahui penggunaan keyword (try, catch, throw) dan alur eksekusi exception handling c++, perhatikan program di bawah ini.
/*
      Mengenal Exeption Handling pada C++
      Microsoft Visual Studio Express 2012
      [RS]
*/
#include <iostream>
#include <conio.h>
using namespace std;

int main()
{
      cout<<"EXCEPTION HANDLING C++"<<endl;
      cout<<"----------------------"<<endl;
      try
      {
            //throw(53);
            throw("Pesan ini ditangkap oleh handler dan ditampilkan ke layar.");
            //throw(53.4);
      }
      catch(int e) //handler
      {
            cout<<e<<endl;
      }
      catch(char* e) //handler
      {
            cout<<e<<endl;
      }
      catch(...) //default handler
      {
            cout<<"Default Handler\nMenangkap semua exception yang tidak dapat ditangkap/ditangani handler lain."<<endl;
      }

      _getche();
      return 0;
}

Output
Jika menggunakan throw(53);
EXCEPTION HANDLING C++
----------------------
53

Jika menggunakan throw("Pesan ini ditangkap oleh handler dan ditampilkan ke layar.");
EXCEPTION HANDLING C++
----------------------
Pesan ini ditangkap oleh handler dan ditampilkan ke layar.

Jika menggunakan throw(53.4); karena tidak ada handler khusus yang digunakan untuk menangkap tipe exception float/double maka handler default lah yang dijalankan
EXCEPTION HANDLING C++
----------------------
Default Handler
Menangkap semua exception yang tidak dapat ditangkap/ditangani handler lain.

Penjelasan:
Pada program di atas terdapat tiga buah handler
-       catch(int e){ } : digunakan untuk menangkap/menangani exception bertipe integer yang dilempar dengan keyword throw
-       catch(char* e){ } : digunakan untuk menangkap/menangani exception bertipe karakter/string yang dilempar dengan keyword throw
-       catch(...){ } : Jika menggunakan parameter berupa ellipsis (...) maka handler ini dapat digunakan untuk menangkap semua exception yang tidak dapat ditangkap/ditangani oleh handler lain, tidak peduli tipe exceptionnya. Handler ketiga ini berperan sebagai handler default, kurang lebih tugasnya hampir sama dengan default yang terdapat pada switch-case.

Alur exception handling:
     Kode dalam try dijalankan, kemudian throw("Pesan ini ditangkap oleh handler dan ditampilkan ke layar."); dieksekusi. Selanjutnya handler menangkap exception, di sini perlu diperhatikan handler yang digunakan untuk menangkap/menangani exception sesuai dengan tipe exception yang dilemparkan melalui keyword throw, maka handler catch(char* e){ } lah yang dijalankan.


Contoh program mencegah pembagian bilangan dengan 0 dengan exception handling:
/*
      Mengenal Exeption Handling pada C++
      Microsoft Visual Studio Express 2012
      [RS]
*/
#include <iostream>
#include <conio.h>
using namespace std;

double bagi(double x, double y)
{
      //jika y (input user sama dengan 0)
      if (y==0){
            throw ("Pembagian dengan 0 tidak diperbolehkan");
      }

      return (x/y);
}


int main()
{
      double x, y, hasil;
      x = 10;

      cout<<"PEMBAGIAN - EXCEPTION HANDLING C++"<<endl;
      cout<<"----------------------------------"<<endl;
      cout<<"Bilangan = "<<x<<endl;
      cout<<"\nMasukkan bilangan pembagi : ";
      cin>>y;
      cout<<endl;

      try
      {
            hasil = bagi(x, y);
            cout<<x<<"/"<<y<<" = "<<hasil<<endl;
      }
      catch(char* e) //handler
      {
            cout<<e<<endl;
      }

      _getche();
      return 0;
}

Output
Jika pembagi sama dengan 0
PEMBAGIAN - EXCEPTION HANDLING C++
----------------------------------
Bilangan = 10

Masukkan bilangan pembagi : 0

Pembagian dengan 0 tidak diperbolehkan

Jika pembagi selain 0
PEMBAGIAN - EXCEPTION HANDLING C++
----------------------------------
Bilangan = 10

Masukkan bilangan pembagi : 4

10/4 = 2.5

Penjelasan
Jika input berupa 0 maka exception akan dijalankan dan handler akan menangkap exception dan mengeksekusi blok kode yang terdapat pada handler. Sebaliknya jika input user selain 0 maka exception tidak dijalankan sehingga semua handler akan diabaikan dan program dijalankan secara normal.


Exception Standar pada C++
Pada C++ juga sudah disediakan exception standar bawaan untuk menangani error dan atau keadaan tertentu. Untuk menggunakan exception standar bawaan C++ ini kita perlu menyertakan header <exception>. Terdapat banyak exception standar pada C++, namun pada pengenalan exception handling ini saya hanya akan memberikan dua contoh program yang menggunakan exception, yaitu bad_aloc dan logic_error
-       bad_aloc : exception ini terjadi ketika terdapat kesalahan saat pengalokasian memori dinamis.
-       logic_error : exception ini mempunyai beberapa turunan. Dimana yang akan digunakan pada contoh program adalah out_of_range.

bad_aloc
Contoh penggunaan exception bad_aloc yang disediakan C++:
/*
      Mengenal Exeption Handling pada C++
      Microsoft Visual Studio Express 2012
      [RS]
*/
#include <iostream>
#include <conio.h>
#include <exception>
using namespace std;

int main()
{
      cout<<"ALOKASI MEMORI - EXCEPTION HANDLING C++"<<endl;
      cout<<"---------------------------------------"<<endl;
      cout<<endl;

      int *aloc1, *aloc2, *aloc3, *aloc4, *aloc5;

      try
      {
            //Pengalokasian memori
            aloc1 = new int[100000000];
            aloc2 = new int[100000000];
            aloc3 = new int[100000000];
            aloc4 = new int[100000000];
aloc5 = new int[100000000];
      }
      catch (bad_alloc& e)
      {
            cout<<"Exception Ditangkap"<<endl;
            cout<<"Pesan : " << e.what() << endl;
      }

      _getche();
      return 0;
}

Output:
ALOKASI MEMORI - EXCEPTION HANDLING C++
---------------------------------------

Exception Ditangkap
Pesan : bad allocation

Catatan : Deklarasikan variabel *aloc6, *aloc7...*alocN dan alokasikan memori pada blok try seperti baris sebelumnya, APABILA exception belum muncul.


logic_error
Contoh penggunaan exception logic_error yang disediakan C++:
/*
      Mengenal Exeption Handling pada C++
      Microsoft Visual Studio Express 2012
      [RS]
*/
#include <iostream>
#include <conio.h>
#include <vector>
#include <exception>
using namespace std;

int main()
{
      cout<<"VECTOR - EXCEPTION HANDLING C++"<<endl;
      cout<<"-------------------------------"<<endl;
      cout<<endl;

      vector <int> narray;
      narray.push_back(53);
      narray.push_back(64);

      try
      {
            //cout<<narray.at(1); //sukses
            cout<<narray.at(3); //error
      }
      catch (logic_error& e)
      {
            cout<<"Exception Ditangkap"<<endl;
            cout<<"Pesan : " << e.what() << endl;
      }

      _getche();
      return 0;
}

Output
VECTOR - EXCEPTION HANDLING C++
-------------------------------

Exception Ditangkap
Pesan : invalid vector <T> subscript


Pada program di atas exception akan ditangkap oleh logic_error. Exception terjadi karena variabel narray hanya mempunyai dua index/subscript yang berisi data (subscript 0 : 53 dan subscript 1 : 64) sedangkan yang diakses adalah subscript 3.

Lalu bagaimana jika kedua program di atas  tidak menggunakan exception handling?
Jawabnya : Lihat gambar di awal postingan ini.


Semoga bermanfaat :)

[RS]  

Klik Like & Share jika postingan ini bermanfaat
Apa tanggapan Anda?

Berikan tanggapan Anda melalui kolom komentar yang telah disediakan.
- Gunakan bahasa yang sopan;
- Saat menjadikan postingan pada blog ini sebagai referensi, jangan lupa mencantumkan sumbernya (link dari blog ini).

Jika blog ini bermanfaat jangan lupa memberikan 'like' atau 'share' untuk mendapatkan update terbaru.

Terima kasih