1 / 37

EXCEPTION HANDLING Pertemuan 11

EXCEPTION HANDLING Pertemuan 11. Matakuliah : Konsep Bahasa Pemrograman Tahun : 2010. Outline Materi. Exception Handling EH di PL/I EH di Ada EH di C++ EH di Java. Exception Handling. EH Awalnya di desain di PL/I (ANSI 76). Bahasa tanpa EH

alessa
Download Presentation

EXCEPTION HANDLING Pertemuan 11

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. EXCEPTION HANDLINGPertemuan 11 Matakuliah : Konsep Bahasa Pemrograman Tahun : 2010

  2. Outline Materi Exception Handling EH di PL/I EH di Ada EH di C++ EH di Java

  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

  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 exceptionhandler

  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.

  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

  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? • Bagaimana eksepsi di-disable?

  8. 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

  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.

  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)

  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

  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

  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.

  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

  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

  16. Evaluasi • Desain Ada untuk EH merupakan state-of-the-art di-1980-an • Lebih maju daripada PL/I • Ada adalah bahasa yang digunakann secara luas sampai ditambahkannya EH di C++

  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 }

  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

  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

  20. Eksepsi tak tertangani dan Kontinuasi • Eksepsi tak tertangani disebar ke pemanggil fungsi di mana dia di-raise • 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 (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

  22. EH di Java • Berdasarkan C++, tetapi lebih sejalan dengan konsep POO • Semua eksepsi adalah obyek class yang merupakan turunan dari klas Throwable

  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

  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();

  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

  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

  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

  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

  29. Klausa finally • Dapat muncul diakhir konstruksi try • Bentuk: finally { ... } • Tujuan: untuk menspesifikasi kode yang akan dieksekusi, abaikan apa yang terjadi dalam konstruksi try

  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

  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;

  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

  33. LATIHAN • 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

  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

  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?

  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

More Related