Apa Itu Exception Handler?
Exception handler adalah kode yang menentukan apa yang harus dilakukan oleh sebuah program ketika terjadi suatu kejadian yang tidak biasa atau luar biasa, yang mengganggu jalannya instruksi program tersebut.
Program perangkat lunak, apa pun bahasa yang digunakan untuk menulisnya, dirancang untuk berjalan dengan cara tertentu dan menghasilkan hasil tertentu. Namun, jika ada kejadian yang tidak direncanakan terjadi selama eksekusi program, hal itu dapat mengganggu jalannya instruksi dan menghasilkan output yang tidak diinginkan atau tak terduga. Kejadian ini disebut exception. Secara umum, dalam konteks komputasi dan rekayasa perangkat lunak, exception terjadi saat sebuah program sedang menjalankan dan mengganggu jalannya instruksi-instruksinya.
Program harus dapat menangani exception agar operasinya yang terganggu akibat exception tersebut bisa selesai tanpa masalah atau kesalahan lebih lanjut. Hampir semua bahasa pemrograman populer, termasuk Java, C#, dan Python, mendukung kemampuan ini yang disebut sebagai penanganan exception. C adalah salah satu dari sedikit bahasa yang tidak mendukungnya, meskipun bahasa ini menawarkan berbagai cara untuk memeriksa kesalahan.
Checked dan Unchecked Exceptions
Beberapa bahasa pemrograman seperti Java membedakan atau mengakui dua jenis exception: checked dan unchecked.
Checked exceptions adalah exception yang harus ditangani (wajib) dan terdeteksi pada saat kompilasi. Biasanya, checked exceptions, yang juga dikenal sebagai logical exceptions, dapat dipulihkan karena kompiler memaksa pengguna untuk menanganinya. Jika exception ini tidak ditangani, maka akan menghasilkan kesalahan kompilasi.
Unchecked exceptions adalah exception runtime daripada exception pada saat kompilasi. Exception ini biasanya menunjukkan bahwa terjadi sesuatu yang salah dengan program. Exception ini sering kali tidak dapat dipulihkan dan dapat menyebabkan masalah serius serta hasil yang keliru, termasuk penghentian aplikasi yang tidak terduga atau crash. Kesalahan adalah salah satu jenis unchecked exception.
Checked dan unchecked exceptions keduanya merupakan jenis exception bawaan; artinya, mereka tersedia dalam pustaka berbagai bahasa pemrograman. Pengguna juga dapat membuat exception (exception yang didefinisikan oleh pengguna) untuk menggambarkan situasi yang tidak dapat dijelaskan dengan baik oleh exception bawaan.
Bagaimana Penanganan Exception Bekerja
Program berkomunikasi dengan sistem operasi dan sistem perangkat lunak lainnya melalui berbagai lapisan.
Dalam semua bahasa pemrograman yang memiliki kemampuan penanganan exception bawaan, proses umumnya mengikuti jalur yang sama.
Ketika checked exception terjadi, metode di mana exception tersebut terjadi akan membuat objek exception objek yang berisi informasi tentang exception tersebut, seperti jenis exception dan status program saat kejadian. Pembuatan dan penerusan objek ini ke sistem runtime disebut melemparkan exception.
Setelah sistem runtime menerima objek exception, ia mencari melalui lapisan-lapisan berikutnya, mencari kode penangan exception yang sesuai dengan yang tertera di objek exception. Di sini, tujuan sistem adalah menemukan kode (atau lebih tepatnya, blok kode) melalui daftar metode yang dapat menangani exception tersebut. Daftar ini dikenal sebagai call stack, dan sistem runtime melaluinya dalam urutan terbalik dari metode yang dipanggil (setelah melihat metode di mana kesalahan terjadi).
Jika ditemukan exception handler yang dapat menangani tipe objek exception, handler tersebut dikatakan “menangkap” exception. Jika sistem runtime tidak dapat menemukan handler yang sesuai setelah mencari melalui seluruh call stack, sistem operasi akan menghasilkan pesan exception fatal, yang berarti program harus ditutup dan mungkin sistem harus dimatikan juga.
Penanganan Exception di Java
Di Java, exception dapat terjadi karena input pengguna yang tidak valid, kegagalan perangkat, atau kesalahan dalam kode. Kehabisan memori disk, pengguna yang mencoba membuka file yang tidak ada, dan kehilangan koneksi jaringan juga dapat menyebabkan exception yang mengganggu program.
Baik checked maupun unchecked exception dapat terjadi di Java. Program Java umumnya dapat pulih dari checked exceptions, dengan penangan exception yang ditulis dalam setiap program untuk menentukan apa yang harus dilakukan sesuai dengan kondisi yang ditentukan. Berikut adalah contoh checked exceptions di Java:
- ClassNotFoundException
- FileNotFoundException
- IOException
- SQLException
- RemoteException
- InterruptedException
Pengguna dapat menangani pengecualian yang terdeteksi (checked exceptions) di Java dengan membungkus kode yang melemparkan pengecualian dalam blok “try catch” atau dengan menggunakan kata kunci “throw” untuk melemparkan pengecualian yang terdeteksi ke atas tumpukan panggilan (call stack) agar metode pemanggil yang menangani.
Selain try, catch, dan throw, Java juga menyediakan beberapa kata kunci lainnya untuk menangani pengecualian yang terdeteksi. Salah satunya adalah “finally,” yang digunakan untuk mengeksekusi kode program yang diperlukan, terlepas dari apakah pengecualian ditangani atau tidak. Kata kunci lainnya adalah “throws,” yang selalu digunakan dengan tanda tangan metode untuk mendeklarasikan pengecualian yang terdeteksi dan menyatakan bahwa pengecualian mungkin terjadi di dalam metode tersebut.
Pengecualian yang tidak terdeteksi (unchecked exceptions) adalah peristiwa yang lebih sulit diprediksi yang terjadi saat program Java dijalankan. Contoh umum pengecualian yang tidak terdeteksi di Java termasuk:
- NullPointerException
- ArithmeticException
- ClassCastException
- ArrayStoreException
- IllegalThreadStateException
Pengecualian-pengecualian ini — dan kesalahan seperti stack overflow, rekursi tak terbatas, atau kebocoran memori — kadang dapat ditangani, namun biasanya tidak dapat. Oleh karena itu, penting untuk mengidentifikasi, melacak, dan menganalisis kesalahan secara real-time dan sebelum runtime. Pemantauan kesalahan yang berkelanjutan dan penanganan dapat membantu mengidentifikasi pengecualian lebih awal, sebelum menyebabkan masalah serius dalam program.
Contoh Exception Handler di Java
Berikut adalah contoh pseudocode di Java untuk penanganan pengecualian yang ditulis untuk tipe pengecualian yang telah dideklarasikan sebelumnya, EmptyLineException:
try {
line = console.readLine();
if (line.length() == 0) {
throw new EmptyLineException("The line read from console was empty!");
}
console.printLine("Hello %s!" % line);
console.printLine("The program ran successfully");
}
catch (EmptyLineException e) {
console.printLine("Hello!");
}
catch (Exception e) {
console.printLine("Error: " + e.message());
}
finally {
console.printLine("The program terminates now");
}
Penanganan Exception handler di C#
Exception dapat terjadi dalam program C# karena berbagai alasan: mencoba menghubungkan ke database yang tidak ada, membuka file yang rusak, dan lain-lain. Seperti halnya di bahasa lain seperti Java, sistem akan menaikkan pengecualian saat mendeteksi kejadian seperti itu dalam program C#. Pengecualian tersebut kemudian ditangani dengan mendefinisikan blok kode penanganan pengecualian yang akan dijalankan saat pengecualian dilemparkan.
Dalam bahasa ini, pengecualian biasanya dihasilkan dengan empat cara berikut:
- Oleh runtime bahasa umum (CLR).
- Oleh pustaka .NET.
- Oleh pustaka pihak ketiga.
- Oleh kode aplikasi.
Exception dibuat menggunakan kata kunci “throw” dan ditangani menggunakan kata kunci “try,” “catch,” dan “finally.” Jika penanganan Exception tidak tersedia untuk pengecualian tertentu, program akan berhenti menjalankan dan menampilkan pesan kesalahan.
Tiga pengecualian yang paling umum di C# adalah ArgumentException (argumen metode menerima nilai argumen yang tidak valid), ArgumentNullException (nilai null yang tidak diizinkan diteruskan ke argumen metode), dan ArgumentOutOfRangeException (nilai argumen berada di luar rentang yang diizinkan).