Matakuliah : Konsep Bahasa Pemrograman Tahun : 2010 EXCEPTION HANDLING Pertemuan 11 Outline Materi • • • • • Exception Handling EH di PL/I EH di Ada EH di C++ EH di Java Bina Nusantara University 3 Exception Handling •EH Awalnya di desain di PL/I (ANSI 76). •Bahasa tanpa EH – Jika eksepsi muncul, kendali kembali ke OS dimana pesan ditampilkan dan program berakhir •Bahasa dengan EH – Program dapat menangani eksepsi dengan kemungkinan untuk memperbaikinya dan kontinu Bina Nusantara University 4 Konsep Dasar • Banyak bahasa mengijinkan program menangani eror i/o termasuk EOF • Exception adalah kejadian tak biasa, eror atau bukan, dideteksi oleh hardware atau software, yang butuh penanganan khusus • Pemrosesan khusus yang mungkin dbutuhkan sesudah deteksi eksepsi disebut exception handling (EH) • Unit kode EH disebut exception handler Bina Nusantara University 5 Alternatif EH • Eksepsi dimunculkan ketika eror terjadi • Bahasa yang tidak mempunyai EH tetap dapat mendefinisikan , deteksi , memunculkan dan menangani eksepsi (user defined, software detected) • Alternatif – Kirim parameter tambahna atau gunakan nilai balik untuk menyatakan status balik subprogram. Di C, nilai balik digunakan sebagai indikator eror – Kirim parameter label ke semua subprograms. Biasa di FORTRAN – Kirim EH subprogram ke semua subprograms. Masalah dibutuhkan untuk mengirim handler untuk setiap call. Bina Nusantara University 6 Keuntungan bulit-in Handler • Tanpa handler, kode deteksi eror sulit ditulis dan membuat program makin ruwet • Penyebaran eksepsi dapat ditangani oleh satu handler, i.e, gunakan kembali handler untuk penyebaran eksepsi • Mendorong user untuk mempertimbangkan event yang dapat muncul selama eksekusi • Situasi tak biasa dapat disederhanakan oleh handler Bina Nusantara University 7 Isu Desain • Bagaimana dan dimana handler dispesifikasi dan apa lingkupnya? • Bagaimana kemunculan eksepsi diikat ke handler? • Dimana eksekusi kontinu sesudah handler selesai dieksekusi? • Bagaimana user-defined exceptions dispesifikasi? • Perlukah ada default handler untuk program yang tidak bisa menyediakannya? • Apakah ada bulit-in eksepsi? Dapatkah ia di-raise secara eksplisit? • Apakah hardware-detectable errors diperlakukan sebagai eksepsi yang perlu ditangaini? 8 Bina Nusantara University Isu #1 • void example() { … average = sum / total; … return // exception handler when zero_devide { average = 0; printf(“ERROR – divisor (total) is zero\n”); } } • Bentuk handler – Unit program utuh – Segmen Kode • Dicangkokkan di unit yang memunculkan EH • Dicangkokkan di unit berbeda Bina Nusantara University 9 Isu #1 (lanjutan) • Jika handler adalah unit terpisah dan bahasa menggunakan static scoping, handler juga menggunakan static scoping dan komunikasi kedua unit sederhana • Jika unit terpisah diluar lingkup maka komunikasi melalui parameter. Bina Nusantara University 10 EH di PL/I • • Built in eksepsi dan user defined eksepsi Bentuk eksepsi user defined ON condition [SNAP] begin … end • • Pengikatan eksepsi ke handler: dinamik dispesifikasi oleh ON Kontinuasi – Kembali ke pernyataan yang menyebabkan eksepsi – Program berakhir – Kendali kembali ke sembarang lokasi di program • Bentuk lain eksepsi user defined CONDITION exception_name • Harus di-raise secara eksplisit oleh SIGNAL CONDITION (exception_name) Bina Nusantara University 11 EH di PL/I (lanjutan) • Ada 22 built in eksepsi mulai dari eror aritmatika (dibagi nol) sampai eror pemrograman (rentang subscript) • Kategori – Selalu enabled – Enabled by default tetapi disabled by user code – Disabled by default tetapi enabled by user code • Evaluasi – Desain powerful dan luwes – Costly: pengikatan dinamik eksepsi ke handler dapat membuat masalah dalam writeability / readability. Solusi : gunakan pengikatan statik (Goodenough, 1975) – Masalah dengan fleksibilitas kontinuasi • Sulit diimplementasikan • Mengganggu readability • Sulit dipelajari untuk penggunaan yang efektif Bina Nusantara University 12 EH di Ada • Handler di Ada dapat muncul di subprogram, package, task, atau block • Karena biasanya handler lokal ke kode, mereka tidak punya parameter • Bentuk handler: when exception_choice{|exception_choice} => statement_sequence dimana { } berarti left out atau ulangi • Bentuk exception_choice exception_name | others • Handler diletakkan diakhir block, subprogram atau unit, package atau task di mana mereka muncul Bina Nusantara University 13 Pengikatan Eksepsi ke Handler • Pengikatan statik • Jika blok atau unit dimana eksepsi muncul tidak mempunyai handler untuk eksepsi, eksepsi menyebar kemana saja untuk ditangani – Procedures – menyebar ke caller – Blocks – menyebar ke lingkup di mana ia muncul – Package body – menyebar ke bagian deklarasi unit yang mendeklarasikan paket; jika ia unit library , program berakhir – Task – tak ada penyebaran; jika ia punya handler, eksekusi; dalam hal apapun, tandai dengan "completed" • Kontinuasi : blok atau unit yang memunculkan eksepsi tetapi tidak dapat menanganinya selalu berakhir. Bina Nusantara University 14 Isu Desain lain • Bentuk user-defined exceptions: exception_name_list : exception; diperlalukan sebagai built in exception • Bentuk raising exceptions : raise [exception_name] – (nama eksepsi tidak dibutuhkan jika ia dalam handler—dalam hal ini ia menyebarkan eksepsi yang sama ) • Kondisi eksepsi dapat di-disable dengan: pragma SUPPRESS(exception_list) dimana pragma adalah directive ke kompilator Bina Nusantara University 15 Eksepsi predefine/built-in • CONSTRAINT_ERROR – konstrain indeks, konstrain range dsb. • NUMERIC_ERROR – operasi numerik tak dapat mengembalikan nilai yang benar (overflow, pembagian dengan nol, dsb.) • PROGRAM_ERROR – penggil subprogram yang body tidak dielaborasi • STORAGE_ERROR – sistem runs out of heap • TASKING_ERROR - eror berasosiasi dengan task Bina Nusantara University 16 Evaluasi • Desain Ada untuk EH merupakan state-of-the-art di1980-an • Lebih maju daripada PL/I • Ada adalah bahasa yang digunakann secara luas sampai ditambahkannya EH di C++ Bina Nusantara University 17 EH di C++ • Ditambahkan ke C++ tahun 1990 • Desain berdasarkan pada CLU, Ada, dan ML • Lingkup handler di Ada dispesifikasi oleh blok atau unit program sedangkan di oleh try-construct. • Bentuk handler: try { -- kode yang diduga memunculkan eksepsi } catch (formal parameter) { -- kode handler } ... catch (formal parameter) { -- kode handler } Bina Nusantara University 18 Fungsi catch • catch adalah nama semua handler—ia adalah nama overloaded , sehingga parameter formal harus unik • Parameter formal tidak butuh variable seperti dalam parameter fungsi • Parameter formal dapat digunakan untuk mengirim informasi ke handler • Parameter formal dapat ellipsis (…), yang berarti menangani semua eksepsi yang tidak tertangani Bina Nusantara University 19 Eksepsi throw • Semua eksepsidi-raise oleh pernyataan throw [expression]; • Brackets [ ] adalah metasymbol, i.e. ekspresi bersifat opsional • throw tanpa operan hanya dapat muncul di handler; jika muncul, ia re-raise eksepsi yang kemudian ditangani disembarang lokasi Bina Nusantara University 20 Eksepsi tak tertangani dan Kontinuasi • Eksepsi tak tertangani disebar ke pemanggil fungsi di mana dia diraise • Penyebaran berlanjut ke fungsi main • Jika tak ada handler ditemukan, program berakhir • Kontinuasi – Sesudah handler menyelesaikan eksekusinya, alir kendali kembali ke pernyataan pertama sesudah handler terakhir dalam sekuen handler – Pilihan desain lain • Semua eksepsi adalah user-defined • Eksepsi tidak dispesisikasi maupun dideklarasi • Fungsi dapat mendaftar eksepsi yang mereka raise • Tanpa spesifkasi, fungsi dapat me-raise sembarang eksepsi Bina Nusantara University (klausa throw) 21 Isu Desain Lain dan Evaluasi • Hanya ada eksepsi user defined • Tak ada default handler • Fungsi dapat me-list tipe eksepsi int fun() throw(int, char *) { … } menentukan bahwa fun() memunculkan eksepsi tipe int dan char * • Evaluasi – – – – – Pengikatan statik Ganjil karena tak bernama Tak ada built in hardware handler Eksepsi tak tertangani disebar ke pemanggil Pengikatan eksepsi ke handler melalui tipe parameter tidak mempromosikan readability Bina Nusantara University 22 EH di Java • Berdasarkan C++, tetapi lebih sejalan dengan konsep POO • Semua eksepsi adalah obyek class yang merupakan turunan dari klas Throwable Bina Nusantara University 23 Class Eksepsi • Kepustakaan Java memuat dua subclasse dari Throwable : – Error • Dilempar oleh Java interpreter untuk events seperti heap overflow • Tidak pernah ditangani oleh user programs – Exception • User-defined exceptions biasanya subclasses-nya • Mempunyai dua predefined subclasses, IOException dan RuntimeException (e.g., ArrayIndexOutOfBoundsException dan NullPointerException Bina Nusantara University 24 Handler di Java • Seperti C++, kecuali setiap catch memerlukan nama parameter dan setiap parameter harus turunan dari Throwable • Sintaks klausa try sama dengan C++ • Eksepsi dilempar dengan throw, tetapi throw memuat operator new untuk membentuk obyek seperti dalam : throw new MyException(); Bina Nusantara University 25 Pengikatan Eksepsi ke Handler • Lebih sederhana daripada di C++ – Eksepsi diikat ke handler pertama dengan parameter adalah class yang sama atau ansestor darinya • Eksepsi dapat ditangani atau dilempar kembali dengan memasukkan throw dalam handler Bina Nusantara University 26 Kontinuasi • Jika tak ada handler ditemukan dalam konstruksi try pencarian dilanjutkan konstruksi try terdekat dst • Jika tak ada handler ditemukan dalam metode eksepsi menyebar ke pemanggil metode • Jika tak ada handler ditemukan program berakhir • Untuk meyakinkan bahwa semua eksepsi ditangkap, handler dapat dimasukkan ke sembarang konstruksi try yang menangkap semua eksepsi Bina Nusantara University 27 Eksepsi dicek dan tak dicek • Klausa Java throws jauh berbeda dari klausa throw C++ • Eksepsi class Error dan RunTimeException dan semua turunannya disebut unchecked exceptions • Semua eksepsi lain disebut checked exceptions • Checked exceptions yang mungkin dilempar oleh metode harus berbentuk – Didaftar di klausa throws atau – Ditangani di metode Bina Nusantara University 28 Isu Desain Lain • Metode tak dapat men-declare lebih banyak eksepsi di klausa throws nya daripada metode di-overrides • Metode yang memanggil checked exception khusus dalam klausa throws mempunyai tiga alternatif untuk berhubungann dengan eksepsi : – Tangkap dan tangani eksepsi – Tangkap eksepsi dan lempar eksepsi yang terdaftar dalam klausa throw – Deklarasikan di dalam klausa throw dan jangan tangani Bina Nusantara University 29 Klausa finally • Dapat muncul diakhir konstruksi try • Bentuk: finally { ... } • Tujuan: untuk menspesifikasi kode yang akan dieksekusi, abaikan apa yang terjadi dalam konstruksi try Bina Nusantara University 30 Contoh • Konstruksi try dengan klausa finally try { for (index = 0; index < 100; index++) { … if (…) { return; } //** end of if } //** end of try clause finally { … } //** end of try construct Bina Nusantara University 31 Assertion • Pernyataan dalam program tipe boolean yang mengindikasikan current state komputasi • Jika TRUE , tak terjadi apa-apa • Jika FALSE eksepsi AssertionError dilempar • Dapat di-disable selama eksekusi tanpa modifikasi program atau kompilasi ulang • Dua bentuk – assert condition; – assert condition: expression; Bina Nusantara University 32 Evaluasi • Tipe eksepsi lebih berarti daripada kasus C++ • Klausa throws lebih baik daripada di C++ (Klausa throw di C++ sedikit dketahui oleh pemrogram) • Klausa finally kerap bermanfaat • Interpreter Java melempar berbagai eksepsi yang dapat ditangani oleh program yang dibuat pengguna Bina Nusantara University 33 LATIHAN A. Soal Pilihan 1. Komunikasi data task dilakukan melalui a. shared nonlocal dan parameter b. parameter dan message passing c. message passing dan shared nonlocal d. shared nonlocal, parameter dan message passing 2. Orang yang mengusulkan penggunanan static binding antara exception dan handler adalah a. J.B. Goodenough b. C.A.J. Hoare c. E.W. Dijkstra d. B. Stroustrop 3. Exception handling di C++ berbeda dengan di Ada dalam hal a. no built in exception dan not named user defined exception b. there exist built in exception dan not named user defined exception c. no built in exception dan named user defined exception d. there exist built in exception dan named user defined exception Bina Nusantara University 34 LATIHAN 4. Semua handler di C++ mempunyai nama yang sama yaitu catch. Kasus ini dikenal sebagai a. overvalue name b. overloaded name c. polymorphic name d. trivial name 5. Exception handling di C++ mirip dengan di Ada dalam hal a. binding static dan menyebar ke function caller b. binding dynamic dan menyebar ke function caller c. binding static dan menyebar ke main function d. binding dynamic dan menyebar ke main function Bina Nusantara University 35 LATIHAN B. Soal Uraian 1. Definisikan exception, exception handling, raising an exception, disabling an exception, continuation dan built in exception. Tulislah penggalan kode untuk mengkonstruksi exception handlers di C++. Jelaskan mengapa mekanisme exception handling di Java lebih baik daripada di C++. 2. Bagaimana exception handler di tulis di C++ sehingga ia dapat menangani semua exception? Bina Nusantara University 36 Ringkasan • Ada menyediakan fasilitas EH yang ekstensif berupa sekumpulan eksepsi built-in yang komprihensif • C++ tidak menyediakan predefined exceptions. Eksepsi diika ke handler dengan menghubungkan tipe parameter dalam pernyataan throw ke parameter formal dalam fungsi catch • Eksepsi Java mirip dengan C++ kecuali bahwa eksepsi Java harus turunan dari klas Throwable. Java juga memuat klausa finally Bina Nusantara University 37
© Copyright 2024 Paperzz