download

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