Exception handling adalah Teknik yang digunakan untuk mengatasi exception dengan cara
yang terkendali dan menghindari program berhenti atau crash saat exception terjadi. Dalam
pemrograman berorientasi objek, exception handling sering melibatkan penggunaan blok
`try`, `except`, `finally`, dan `raise` untuk menangkap, menangani, dan mengelola
exception.
Dengan demikian, exception handling adalah alat yang penting dalam membangun
perangkat lunak yang andal, responsive, dan aman. Ini membantu memastikan bahwa
program anda tidak hanya berjalan dengan baik dalam situasi normal, tetapi juga dapat
menghadapi kesalahan dan peristiwa tak terduga dengan cara yang terkendali dan ramah
pengguna.
o Bagaimana exception handling bekerja dalam PBO?
Exception handling dalam pemrograman berorientasi objek (PBO) bekerja dengan cara
yang sama dengan exception handling dalam paradigma pemrograman lainnya, tetapi
dalam PBO, anda akan berurusan dengan objek exception yang biasanya merupakan
instance dari kelas-kelas yang sudah ada atau yang anda buat sendiri.
Contoh sederhana:
Dalam contoh diatas, program mencoba membagi 10 dengan 0, yang akan menghasilkan
`ZeroDivisionError`. Exception ini ditangani dalam blok `except`, dan pesan kesalahan
akan dicetak.
Secara keseluruan, exception handling dalam PBO memungkinkan anda untuk mengelola
kesalahan dengan lebih terstruktur dan fleksibel. Anda dapat menentukan bagaimana
program merespons kesalahan dengan benar dan dapat membantu mencegah program
berhenti tiba-tiba atau memberikan tanggapan yang tidak diinginkan kepada pengguna.
2. Jenis-jenis Exception
o Exception dasar seperti `Exception`, `TypeError`, `ValueError`, dll
1. Exception: Ini adalah kelas dasar untuk semua exception dalam Python. Semua
exception bawaan Python adalah turunan dari `Exception`.
Dalam contoh diatas, Ketika kita mencoba membagi 10 dengan 0, itu akan
memunculkan `SeroDivisionError`, yang merupakan turunan dari `Exception`.
2. TypeError: Exception ini terjadi Ketika ada operasi yang tidak cocok dengan jenis data
yang digunakan.
Dalam contoh diatas, kita mencoba menggabungkan string dengan integer, yang tidak
valid.
3. ValueError: Exception ini terjadi Ketika tipe data benar, tetapi nilainya tidak sesuai
dengan yang diharapkan.
Dalam contoh ini, kita mencoba mengkonversi string “sepuluh” menjadi integer, yang
tidak mungkin dilakukan.
4. ZeroDivisionError: Exception ini terjadi kita mencoba membagi dengan nilai nol.
Dalam contoh ini, kita mencoba membagi 10 dengan 0, merupakan operasi yang tidak
valid.
5. NameError: Exception ini terjadi Ketika mencoba menggunakan variabel yang belum
didefinisikan.
Setiap exception memiliki kondisi khusus yang memicu kemunculannya, dan anda dapat
menangani masing-masing exception sesuai dengan kebutuhan dalam blok `except` yang
cocok. Dengan exception handling, anda dapat mengatasi kesalahan dengan lebih baik dan
memberikan tanggapan yang lebih informatif kepada pengguna atau untuk keperluan
debugging.
3. Menangani Custom Exception: Anda dapat menangani exception dengan blok `try-
except` yang sesuai.
Dalam contoh ini, jika kita mencoba menghitung akar kuadrat dari nilai negative (-5),
custom exception `NilaiNegatifError` akan dilemparkan, dan kita dapat menangani
exception tersebut dengan pesan kesalahan yang sesuai.
Custom exception sangat berguna dalam memahami dan menangani situasi khusus dalam
program anda, dan ini membuat kode anda lebih mudah dibaca dan lebih terstruktur. Anda
dapat membuat custom exception untuk berbagai jenis kesalahan yang spesifik untuk
aplikasi anda.
3. Multiple Except Blocks
o Menangani berbagai jenis exception secara terpisah
Menangani berbagai jenis exception secara terpisah adalah praktik yang baik dalam
pengembangan perangkat lunak. Ini memungkinkan anda untuk memberikan respons yang
lebih tepat terhadap jenis kesalahan yang terjadi dalam program anda.
Berikut cara menangani beberapa jenis exception secara terpisah beserta contoh sederhana:
Menangani `ZeroDevisionError` dan `ValueError`:
Dalam contoh di atas, kita menangani dua jenis exception secara terpisah:
1. Jika pengguna memasukkan 0 sebagai input, itu akan memunculkan
`ZeroDevisionError`.
2. Jika pengguna memasukkan bukan angka (misalnya : “abc”), itu akan memunculkan
`ValueError`.
Dalam contoh di atas, kita menangani dua jenis exception yang terkait dengan berkas:
1. Jika file yang dibuka tidak ada, akan memunculkan `FileNotFoundError`.
2. Jika program tidak memiliki izin akses untuk membaca file, akan memunculkan
`PermissionError`.
Menangani `IndexError` dan `KeyError`:
Dalam contoh di atas, kita menangani dua jenis exception terkait indeks dan kunci:
1. Jika kita mencoba mengakses indeks yang di luar jangkauan daftar, akan memunculkan
`IndexError`.
2. Jika kita mencoba mengakses kunci yang tidak ada dalam kamus, akan memunculkan
`KeyError`.
Dengan menangani exception secara terpisah, anda dapat memberikan pesan kesalahan
yang lebih deskriptif kepada pengguna atau menjalankan Tindakan yang sesuai untuk
setiap jenis kesalahan yang terjadi dalam program anda.
Penggunaan blok `else` dalam pengembangan perangkat lunak PBO memungkinkan anda
untuk memiliki lebih banyak kontrol terhadap alur program anda. Anda dapat menjalankan
Tindakan yang berbeda tergantung pada apakah ada exception atau tidak, sehingga
memberikan respons yang lebih baik kepada pengguna atau menjalankan kode tambahan
jika semuanya berjalan dengan lancer.
o Blok `finally` untuk menjalankan kode yang selalu dijalankan, baik ada exception
atau tidak.
Blok `finally` dalam pemrograman berorientasi objek digunakan untuk menjalankan kode
yang selalu dieksekusi, baik ada exception yang terjadi atau tidak. Ini berguna untuk situasi
dimana anda perlu melakukan pembersihan atau penyelesaian tertentu setelah menjalankan
blok `try` dan `except`.
Contoh:
Dalam contoh ini, kita membuka file untuk membaca. Jika file tidak ditemukan, akan
memunculkan `FileNotFoundError`. Namun, blok `finally` akan tetap dijalankan, dan
kita menggunakan ini untuk memastikan file ditutup dengan benar, terlepas dari apakah
exception terjadi atau tidak.
Blok `finally` sering digunakan untuk melakukan pembersihan, seperti menutup koneksi
basis data atau menghapus sumber daya yang digunakan dalam program, sehingga program
anda dapat berperilaku dengan baik dalam semua situasi.
Penjelasan:
1. Dalam contoh diatas, mendefinisikan sebuah fungsi `bagi(angka1, angka2)` yang
menerima dua angka sebagai argument.
2. Didalam fungsi, dilakukan pemeriksaan jika `angka2` adalah 0. Jika ya, maka
menggunakan `raise` untuk melemparkan exception `ZeroDevisionError` dengan
pesan kesalahan yang sesuai.
3. Dalam blok `try`, memanggi fungsi `bagi(10, 0)` yang mencoba membagi 10 dengan
0. Ini akan memunculkan exception `ZeriDevisionError` yang dihasilkan oleh fungsi
`raise`.
4. Dalam blok `except`, program akan menangani exception tersebut dan mencetak pesan
kesalahan yang diberikan.
Contoh:
Dalam contoh di atas, mendefinisikan fungsi `cek_usia(usia)` yang memeriksa jika usia
yang diberikan negatif. Jika usia negatif, maka menggunakan `raise` untuk melemparkan
exception `ValueError` dengan pesan kesalahan yang sesuai. Kemudian mencoba
menggunakan fungsi ini dengan nilai usia negatif (-5), yang akan memunculkan exception
`ValueError`. Dalam blok `except`, program menangani exception tersebut dan mencetak
pesan kesalahan yang diberikan.
Dengan melemparkan exception secara eksplisit, anda dapat mengendalikan alur program
dengan lebih baik dan memberikan pesan kesalahan yang sesuai dengan situasi yang anda
tentukan.
Contoh:
Penjelasan:
1. Dalam contoh di atas, kita mendefinisikan fungsi `bagikan(angka1, angka2)` yang
mencoba melakukan pembagian `angka1` dengan `angka2` dalam blok `try`.
2. Jika terjadi exception `ZeroDivisionError`, kami menangani exception tersebut di
dalam blok `except` pertama dan mencetak pesan kesalahan yang sesuai.
3. Dalam blok `else`, kita memiliki blok `try` kedua yang mencoba mencetak hasil
pembagian. Dalam situasi tertentu, seperti kesalahan I/O saat mencetak hasil, exception
`IOError` dapat terjadi.
4. Jika terjadi exception `IOError`, program menangani exception tersebut di dalam blok
`except` kedua dan mencetak pesan kesalahan yang sesuai.
Contoh:
1. Pada contoh di atas, kelas `Pengguna` dengan metode `__init__` yang menginisialisasi
objek `Pengguna` dengan nama dan poin awal.
2. Metode `tambah_poin()` digunakan untuk menambahkan poin ke objek `Pengguna`.
Dalam metode ini, menggunakan `try` untuk menangani exception yang mungkin
terjadi.
3. Jika jumlah poin yang akan ditambahkan kurang dari nol, program menggunakan
`raise` untuk menghasilkan exception `ValueError` dengan pesan yang sesuai.
4. Exception yang terjadi akan ditangani dalam blok `except`, dan pesan kesalahan akan
dicetak.
5. Objek `pengguna1` dari kelas `Pengguna` dan memanggil metode `tambah_poin()`
dengan argument yang berbeda. Yang pertama berhasil manambahkan poin, sedangkan
yang kedua mencoba menambahkan poin negatif, yang akan menghasilkan exception.
Contoh diatas adalah bagaimana anda dapat menangani exception dalam metode kelas
untuk memastikan bahwa operasi yang spesifik untuk objek tersebut dapat dijalankan
dengan benar. Hal ini membantu untuk menjaga konsistensi dan keandalan dalam aplikasi
anda.
Menggunakan metode `__str__` dan `__repr__` dalam pesan exception membantu dalam
debugging dan pemahaman lebih baik tentang masalah yang terjadi dalam program anda.
8. Best Practices dalam Exception Handling
o Menentukan level detail pesan exception
Dalam penanganan exception, penting untuk mempertimbangkan tingkat detail pesan
exception yang akan anda berikan. Ini berguna unutk debugging dan pemahaman masalah
yang terjadi dalam program anda. Berikut best practices terkait dengan menentukan level
detail pesan exception:
1. Berikan Pesan yang Informatif: Pastikan pesan exception memberikan informasi
yang cukup kepada pengembang atau pengguna akhir untuk memahami masalah yang
terjadi.
2. Jangan Telalu Detail: Hindari memberikan terlalu banyak detail yang mungkin
mengungkapkan informasi sensitif atau rahasia dalam pesan exception. Ini adalah
masalah keamanan.
3. Gunakan Pesan Standar: Untuk jenis exception umum, seperti `ZeroDivisionError`
atau `ValueError`, anda dapat mengandalkan pesan bawaan Python yang sudah cukup
informatif.
4. Custom Exception: Jika anda membuat exception kustom, pastikan pesannya
memberikan konteks yang memadai. Ini dapat membantu pengembang memahami
dimana, bagaimana, dan mengapa exception itu terjadi.
Contoh:
Pilihan untuk tingkat detail pesan exception harus didasarkan pada kebutuhan aplikasi dan
tingkat keamanan yang diperlukan. Jika program anda mengelola informasi sensitif,
pastikan untuk tidak memberikan informasi yang dapat dimanfaatkan oleh pihak yang tidak
berwenang. Sebaliknya, jika anda membutuhkan bantuan dalam debugging, pesan
exception yang informatif dapat sangat berguna.
o Menyederhanakan kode exception handling
Dalam penanganan exception, menyederhanakan kode bisa menjadi praktik terbaik karena
itu membuat kode lebih mudah dibaca dan dipahami.
Contoh:
Dalam contoh di atas, kita menggunakan exception kustom `DatabaseConnectionError`
untuk menangani semua masalah terkait koneksi database yang mungkin terjadi. Ini
menyederhanakan kode karena kita hanya perlu satu blok `except` untuk menangani semua
jenis kesalahan koneksi database.
Selain itu, kita menggunakan blok `finally` untuk menutup koneksi ke database atau
melakukan pembersihan lainnya. Hal ini memungkinkan kode tetap bersih dan memastikan
bahwa sumber daya dibersihkan, bahkan jika ada exception yang terjadi.
Dalam contoh di atas, kita memisahkan logika bisnis validasi nilai dari logika bisnis
menyimpan data ke database. Selain itu, kita menangani exception validasi secara terpisah
dalam blok `try-except` yang relevan, dan kita menggunakan exception kustom
`NilaiTidakValid` untuk menandai kesalahan validasi. Ini memisahkan logika bisnis dari
penanganan exception dengan baik.