Mengenal Exception Handling pada C++
By
Rachmat Santoso
—
Sabtu, 15 April 2017
—
Cplusplus
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