Cara Mendesain Custom Exception
Custom Exception
Seperti yang kita bahas pada artikel sebelumnya tentang custom exception phython adalah
pengecualian yang disesuaikan dengan kebutuhan Anda, dan yang dapat Anda tingkatkan dan tangkap dalam keadaan tertentu. Pengecualian kustom dapat membuat kode Anda lebih mudah dibaca dan kuat, serta mengurangi jumlah kode yang Anda tulis nanti untuk mencoba mencari tahu apa sebenarnya yang salah.
Python memiliki serangkaian pengecualian bawaan, seperti SyntaxError, TypeError, dan ValueError. Namun, terkadang pengecualian bawaan ini mungkin tidak mencukupi untuk kebutuhan Anda.
Jenis-Jenis Exception Handling di Python
Seperti yang telah kita bahas sebelumnya, exception handling adalah mekanisme penting dalam Python untuk menangani kesalahan yang tidak terduga selama eksekusi program. Mari kita bahas lebih dalam mengenai jenis-jenis exception handling:
1. Built-in Exceptions
Python menyediakan berbagai macam built-in exceptions untuk mewakili berbagai jenis kesalahan umum. Beberapa contoh yang sering ditemui adalah:
- ZeroDivisionError: Terjadi ketika mencoba membagi suatu angka dengan nol.
- ValueError: Terjadi ketika suatu operasi dilakukan pada objek dengan tipe data yang salah.
- TypeError: Terjadi ketika operasi dilakukan pada objek dengan tipe data yang tidak kompatibel.
- NameError: Terjadi ketika mencoba mengakses variabel yang belum didefinisikan.
- IndexError: Terjadi ketika mencoba mengakses indeks di luar jangkauan suatu list atau tuple.
- KeyError: Terjadi ketika mencoba mengakses key yang tidak ada dalam dictionary.
- FileNotFoundError: Terjadi ketika mencoba membuka file yang tidak ada.
- ImportError: Terjadi ketika modul atau package yang diimpor tidak ditemukan.
Contoh:
try:
x = int(input("Masukkan angka: "))
y = 10 / x
print(y)
except ZeroDivisionError:
print("Tidak bisa membagi dengan nol")
except ValueError:
print("Input harus berupa angka")
2. Custom Exceptions
Anda juga dapat membuat exception khusus untuk mewakili kesalahan yang spesifik pada aplikasi Anda. Caranya adalah dengan membuat kelas yang mewarisi dari kelas Exception
.
Contoh:
class NegativeNumberError(Exception):
pass
def factorial(n):
if n < 0:
raise NegativeNumberError("Bilangan faktorial tidak boleh negatif")
3. Struktur try-except-else-finally
try
: Blok kode yang berpotensi menimbulkan error.
except
: Blok kode yang akan dijalankan jika terjadi error tertentu.
else
: Blok kode yang akan dijalankan jika tidak ada error yang terjadi dalam blok try
.
finally
: Blok kode yang akan selalu dijalankan, baik terjadi error atau tidak.
Contoh:
try:
f = open("myfile.txt", "r")
data = f.read()
except FileNotFoundError:
print("File tidak ditemukan")
else:
print("File berhasil dibaca")
finally:
f.close()
4. Membangkitkan Exception
Anda dapat secara manual membangkitkan exception menggunakan kata kunci raise
.
def divide(x, y):
if y == 0:
raise ZeroDivisionError("Pembagian dengan nol tidak diizinkan")
return x / y
Tips Tambahan:
- Jadikan spesifik: Semakin spesifik exception yang ditangkap, semakin baik penanganan error yang dilakukan.
- Gunakan
else
: Blok else
berguna untuk kode yang hanya perlu dijalankan jika tidak ada error.
- Gunakan
finally
: Blok finally
berguna untuk membersihkan sumber daya, seperti menutup file atau koneksi database.
- Buat custom exception: Buat custom exception untuk kesalahan yang spesifik pada aplikasi Anda.
- Logging: Catat informasi tentang exception yang terjadi untuk analisis lebih lanjut.
Berikut klikponsel, berikan tips cara mendesain custom exception yang baik
Cara Mendesain custom exception yang baik
Mendesain custom exception yang baik di Python memerlukan beberapa pertimbangan untuk memastikan exception tersebut informatif, mudah digunakan, dan konsisten dengan standar yang ada. Berikut adalah langkah-langkah dan tips untuk mendesain custom exception yang baik:
1. Pilih Nama Exception yang Jelas dan Deskriptif
- Pastikan nama exception Anda menggambarkan masalah spesifik yang terjadi.
- Biasanya, nama exception diakhiri dengan kata “Error” untuk konsistensi, seperti
FileFormatError
, DatabaseConnectionError
, atau InvalidUserInputError
.
2. Turunkan dari Kelas Exception yang Tepat
- Sebagian besar custom exception sebaiknya diturunkan dari
Exception
atau subkelasnya seperti ValueError
, TypeError
, dll., tergantung pada konteksnya.
- Contoh:
class CustomError(Exception):
pass
3. Tambahkan Informasi yang Relevan
- Custom exception sebaiknya membawa informasi yang membantu dalam debugging atau mengatasi masalah.
- Anda dapat menambahkan atribut tambahan pada exception untuk menyimpan data spesifik.
- Contoh:
class InvalidAgeError(ValueError):
def __init__(self, age, message="Age must be between 0 and 120"):
self.age = age
self.message = message
super().__init__(self.message)
4. Overide __str__
atau __repr__
untuk Pesan yang Lebih Informatif
- Override metode
__str__
atau __repr__
untuk memberikan deskripsi kesalahan yang lebih rinci saat exception tersebut dilempar.
- Contoh:
class InvalidAgeError(ValueError):
def __init__(self, age, message="Age must be between 0 and 120"):
self.age = age
self.message = f"{message}: {age} is invalid."
super().__init__(self.message)
def __str__(self):
return self.message
5. Documentasikan Exception dengan Baik
- Jelaskan kapan exception ini harus digunakan dan data apa yang dibawa olehnya. Hal ini memudahkan developer lain (atau diri Anda sendiri di masa depan) untuk memahami bagaimana dan kapan menggunakan exception tersebut.
6. Pertimbangkan Menggunakan Hierarki Exception
- Jika Anda memiliki beberapa custom exception terkait, pertimbangkan untuk membuat hierarki exception dengan superclass yang umum.
- Contoh:
class MyAppError(Exception):
"""Base class for exceptions in this module."""
pass
class DatabaseError(MyAppError):
"""Exception raised for database errors."""
pass
class FileFormatError(MyAppError):
"""Exception raised for errors in file format."""
pass
7. Gunakan Custom Exception dengan Bijak
- Jangan membuat custom exception untuk setiap jenis kesalahan. Gunakan custom exception hanya ketika exception built-in tidak cukup spesifik atau tidak memberikan informasi yang dibutuhkan.
Contoh Implementasi
class InsufficientFundsError(Exception):
def __init__(self, balance, amount):
self.balance = balance
self.amount = amount
self.message = f"Attempted to withdraw {amount}, but only {balance} available."
super().__init__(self.message)
def __str__(self):
return f"{self.__class__.__name__}: {self.message}"
Penggunaan:
balance = 100
amount = 150
if amount > balance:
raise InsufficientFundsError(balance, amount)
Dengan pendekatan ini, exception yang Anda buat akan lebih mudah dipahami, dan informasi kesalahan akan lebih bermanfaat dalam proses debugging atau pemeliharaan kode.