Menggunakan Return Codes
Pertama, kita lihat dahulu code yang menggunakan return codes
StatusCode FailOnThirdOrSeventh( int nom ) { if ( ( nom == 1003 ) || ( nom == 1007 ) ) { return ME_FAIL; } else { cout << "Counting : " << nom << " ... " << endl; return ME_SUCCESS; } }
Ini merupakan cara yang mudah dan lebih cepat daripada memasukin blok try..catch C++, tetapi mari kita lihat jika kode kita seperti ini:
StatusCode DoingSomething( int nom ) { if ( FailOnThirdOrSeventh( nom ) == ME_FAIL ) { return ME_FAIL; } cout << "Doing Something! Behind the Mist..." << endl; return ME_SUCCESS; } void bench() { int i; for(i=0; DoingSomething( i ) != ME_FAIL;++i) { //some loop } }
Snippet di atas harus melakukan tidak kurang dari dua buah conditional check per loop untuk meneruskan error code melalui rantai function call dan tidak mengantisipasi bila fungsi mempunyai return lebih dari dua. Nah! Di sinilah C++ exception menemukan tempatnya.
void FailOnThirdOrSeventh( int nom ) throw (ThirdOrSevenException) { if ( ( nom == 1003 ) || ( nom == 1007 ) ) { throw ThirdOrSevenException(); } cout << "Counting : " << nom << " ... " << endl; } void DoingSomething( int nom ) throw (ThirdOrSevenException) { FailOnThirdOrSeventh( nom ); cout << "Doing Something! Behind the Mist..." << endl; } void bench { try { for(i=0;;++i) { DoingSomething( i ); } } catch( ThirdOrSevenException & ) { } }
Snippet C++ di atas melakukan operasi yang sama hanya saja sekarang tidak perlu memakai conditional check. Kita menukar dua conditional check tadi dengan try-catch block. Tetapi karena try-catch berada di luar loop, maka hanya akan jalan sekali.
Conditional check adalah operasi yang mahal, dengan begitu juga suatu loop merupakan loop yang sibuk, maka code di atas akan merupakan sesuatu yang signifikan daripada memakai return code. Menambahkan exception lain tidak mengubah performa sama sekali. Berbeda jika harus menggunakan conditional check di setiap kondisi error.
Sumber