Apa Itu Exception Handling?
Exception handling adalah cara sebuah program menanggapi error yang terjadi saat program berjalan. Kode yang mungkin gagal ditaruh di blok yang dilindungi, seperti try, dan saat sebuah error dimunculkan, kendali melompat ke handler, seperti except atau catch, alih-alih membuat program crash.
Diperbarui 24 September 2026
Program yang menanyakan umur orang cepat atau lambat akan menerima "twenty", bukan 20. Mengonversi teks itu adalah runtime error: int("twenty") memunculkan ValueError, dan tanpa rencana untuk menghadapinya, program berhenti. Exception handling adalah rencana itu. Kamu menandai kode yang mungkin gagal dan menulis kode yang dijalankan kalau kegagalan itu terjadi.
Next year you will be 35
Not a number: twenty
Next year you will be 20
Done
Jawaban yang salah dilaporkan, dan loop lanjut ke jawaban berikutnya. Tanpa try, program akan mencetak satu baris lalu sebuah traceback.
Cara kerja exception handling
- Kode di dalam
tryberjalan seperti biasa. - Sebuah operasi gagal, dan runtime memunculkan exception: sebuah objek dengan tipe (
ValueError) dan pesan (invalid literal for int() with base 10: 'twenty'). - Blok
tryberhenti di baris itu. Baris-baris sisanya dilewati, itulah sebabnya "Next year you will be" tidak tercetak untuk "twenty". - Runtime membandingkan tipe exception itu dengan setiap klausa
except, dari atas ke bawah, lalu menjalankan yang pertama cocok. - Setelah handler selesai, program lanjut ke baris pertama setelah seluruh pernyataan
try. - Kalau tidak ada klausa yang cocok, exception keluar dari fungsi saat ini dan pencarian berlanjut di fungsi yang memanggilnya, lalu di pemanggil fungsi itu. Ini disebut unwinding call stack. Kalau pencarian sampai ke puncak program tanpa ada yang cocok, program berakhir dengan traceback.
Langkah 6 berarti handler tidak harus berada di fungsi tempat error terjadi. Di sini kegagalannya terjadi dua panggilan lebih dalam, dan handler di bagian bawah tetap menangkapnya:
parsing 4.50
parsing free
Could not add the prices: could not convert string to float: 'free'
float("free") gagal di dalam parse_price. Baik parse_price maupun total tidak punya handler, jadi keduanya ditinggalkan, dan "3.20" tidak pernah di-parse. Inilah pilihan desain utama yang diberikan exception handling: tangani error di tempat kamu tahu harus berbuat apa, yang sering kali jauh dari tempat error itu terjadi.
try, except, else, dan finally
Pernyataan try di Python punya dua bagian opsional lagi. else hanya berjalan kalau blok try selesai tanpa exception. finally berjalan dalam setiap kasus: setelah berhasil, setelah exception ditangani, dan bahkan saat fungsi melakukan return dari dalam try.
no error
finally runs either way
2.0
b was zero
finally runs either way
None
finally adalah tempat untuk pembersihan: menutup file, melepas lock, menutup koneksi database. Di Python, pernyataan with melakukan pembersihan ini untuk file secara otomatis, dan biasanya itulah pilihan untuk file.
Memunculkan exception sendiri
Exception bukan hanya untuk error yang dideteksi bahasanya. Saat fungsimu sendiri menerima input yang tidak bisa diolahnya, fungsi itu bisa memunculkan exception untuk menolaknya, dan pemanggilnya yang memutuskan apa yang terjadi selanjutnya. Mendefinisikan class exception kecil memberi error itu nama yang menjelaskannya.
70
Refused: cannot take 250, balance is 100
Python memakai raise. Java, C++, dan JavaScript memakai throw untuk hal yang sama.
Exception handling di bahasa lain
| Bahasa | Kata kunci | Yang perlu diketahui |
|---|---|---|
| Python | try, except, else, finally, raise | Setiap exception adalah objek yang mewarisi BaseException |
| Java | try, catch, finally, throw, throws | Checked exception seperti IOException harus ditangkap atau dideklarasikan dengan throws |
| C++ | try, catch, throw | Tidak ada finally; destructor yang membersihkan saat stack di-unwind |
| JavaScript | try, catch, finally, throw | Error di kode async ditangkap dengan try di sekitar await |
| C | tidak ada | Fungsi mengembalikan kode error, dan banyak yang mengisi errno |
| Go | tidak ada untuk error biasa | Fungsi mengembalikan nilai error yang diperiksa pemanggilnya |
Contoh parsing yang sama di Java terlihat seperti ini:
try {
int age = Integer.parseInt("twenty");
System.out.println(age + 1);
} catch (NumberFormatException e) {
System.out.println("Not a number: " + e.getMessage());
} finally {
System.out.println("done");
}
Java membagi exception menjadi dua kelompok. Checked exception, seperti IOException, menggambarkan masalah di luar kendali program, dan compiler menolak membangun kode yang tidak menangkap maupun mendeklarasikannya. Unchecked exception, yaitu subclass dari RuntimeException seperti NullPointerException, biasanya berarti ada bug, dan compiler tidak memaksamu untuk menanganinya.
Kesalahan yang umum
- Menangkap semuanya.
except:tanpa tipe di Python juga menangkapKeyboardInterrupt, sehingga Ctrl+C berhenti berfungsi, danexcept Exception:menangkap bug yang tidak pernah kamu rencanakan. Tangkap tipe spesifik yang kamu tahu cara menanganinya. - Menelan error-nya.
except ValueError: passmenyembunyikan masalahnya. Paling tidak, cetak atau catat di log apa yang salah. - Blok
tryyang terlalu besar. Bungkus hanya baris-baris yang bisa memunculkan exception yang sedang kamu tangkap, supaya error yang tidak berkaitan tidak tertangani secara tidak sengaja. - Menangkap bug alih-alih memperbaikinya.
IndexErrordari loop yang berjalan satu langkah terlalu jauh adalah kesalahan di kode. Menanganinya justru membuat kode yang salah itu tetap hidup. - Mengira
catchbisa mencegah crash di C atau C++. Segmentation fault adalah sinyal dari sistem operasi, bukan exception, dan di Linux dan macOS,catch (...)di C++ tidak pernah melihatnya.
Lanjut ke mana
Error yang ditanggapi exception handling dijelaskan di halaman runtime error, dan crash yang tidak bisa ditangkapnya di halaman segmentation fault. Untuk sintaks lengkapnya, baca panduan exception Python, try dan catch di Java, exception C++, dan try dan catch di JavaScript. Kursus Java dan kursus Python sama-sama melatihnya dengan latihan sungguhan.
Pertanyaan yang sering diajukan
Apa saja 5 kata kunci exception handling di Java?
try, catch, finally, throw, dan throws. try menandai kode yang diawasi, catch menangani jenis exception tertentu, dan finally menjalankan kode pembersihan, entah ada exception atau tidak. throw memunculkan sebuah exception, dan throws di signature method menyatakan checked exception mana saja yang bisa diteruskan method itu ke pemanggilnya.Apa itu exception handling di C++?
try, catch, dan throw. Tipe apa pun bisa di-throw, tetapi menurut konvensi kamu melempar objek turunan std::exception, seperti std::runtime_error, dan menangkapnya lewat referensi: catch (const std::exception& e). C++ tidak punya finally; pembersihan terjadi di destructor, yang berjalan otomatis saat stack di-unwind.Apa bedanya error dan exception?
Exception mencakup masalah yang wajar ditangani program, sedangkan Error, seperti OutOfMemoryError atau StackOverflowError, menandakan kegagalan JVM yang biasanya tidak perlu dicoba ditangkap oleh program. Di Python, ValueError dan ZeroDivisionError sama-sama exception meskipun namanya begitu.Apa bedanya throw dan throws di Java?
throw adalah pernyataan yang memunculkan satu exception di titik itu: throw new IllegalArgumentException("negative age");. throws adalah bagian dari deklarasi method yang mendaftar checked exception yang bisa diteruskan method itu ke pemanggilnya: void load() throws IOException. Compiler lalu mewajibkan setiap pemanggil untuk menangkap exception itu atau ikut mendeklarasikannya.Apakah exception handling membuat kode lebih lambat?
try itu murah di sebagian besar bahasa modern. Sejak Python 3.11, try hampir tidak memakan biaya apa pun saat tidak ada exception yang dimunculkan, dan compiler C++ utama tidak menambahkan biaya runtime pada jalur di mana tidak ada yang di-throw. Memunculkan dan menangkap exception jauh lebih lambat daripada pengujian if, jadi di loop yang kritis untuk performa, periksa kasus-kasus yang umum alih-alih mengandalkan exception.