Python - Pengecualian yang Didefinisikan oleh Pengguna

Halo there, para ahli Python masa depan! Hari ini, kita akan memulai perjalanan yang menarik ke dunia pengecualian yang didefinisikan oleh pengguna di Python. Jangan khawatir jika kamu baru mengenal pemrograman; saya akan memandu kamu melalui petualangan ini langkah demi langkah, seperti yang saya lakukan untuk banyak mahasiswa selama tahun-tahun pengajaran saya. Jadi, ambil wands virtual kamu (papan tik), dan mari kita melompatlah!

Python - User-defined Exception

Pengecualian yang Didefinisikan oleh Pengguna di Python

Sebelum kita mulai membuat pengecualian kita sendiri, mari kita singkatkan kembali apa itu pengecualian. Bayangkan jika kamu sedang memasak makanan yang enak, tapi tiba-tiba kamu menyadari kamu kehabisan bahan pokok yang penting. Itu mirip dengan pengecualian dalam pemrograman – itu adalah situasi yang tidak diharapkan yang mengganggu aliran normal kode kamu.

Python datang dengan banyak pengecualian bawaan, seperti ValueError, TypeError, dan ZeroDivisionError. Tetapi kadang-kadang, kita perlu membuat pengecualian khusus kita sendiri untuk menangani situasi yang unik di program kita. Itu tempat pengecualian yang didefinisikan oleh pengguna menjadi berguna!

Cara Membuat Pengecualian yang Didefinisikan oleh Pengguna

Membuat pengecualian kamu sendiri adalah semudah membuat kue (baik, resep kue yang mudah). Semua yang kamu butuhkan adalah untuk membuat kelas baru yang mewarisi dari kelas bawaan Exception atau salah satu subkelasnya. Mari kita lihat contoh sederhana:

class MySpecialError(Exception):
pass

Itu saja! Kamu baru saja membuat pengecualian yang didefinisikan oleh pengguna pertama kamu. Pernyataan pass digunakan karena kita tidak perlu menambahkan fungsi tambahan apa pun ke kelas pengecualian kita.

Tapi apa jika kita ingin pengecualian kita sedikit lebih informatif? Mari kita buat lagi satu:

class ValueTooLargeError(Exception):
def __init__(self, message, value):
self.message = message
self.value = value

Dalam contoh ini, kita telah menambahkan metode __init__ ke kelas pengecualian kita. Ini memungkinkan kita untuk menyampaikan informasi tambahan ketika kita melemparkan pengecualian.

Melemparkan Pengecualian yang Didefinisikan oleh Pengguna

Sekarang bahwa kita memiliki pengecualian kustom kita, mari kita lihat bagaimana kita dapat menggunakannya di kode kita. Melemparkan pengecualian adalah seperti memancarkan alarm ketika sesuatu salah. Ini cara kamu dapat melakukannya:

def check_value(value):
max_value = 100
if value > max_value:
raise ValueTooLargeError("Value is too large!", value)
print(f"Value {value} is acceptable.")

# Mari kita coba
try:
check_value(150)
except ValueTooLargeError as error:
print(f"Oops! {error.message} The value was {error.value}")

Dalam contoh ini, kita sedang memeriksa jika nilai terlalu besar. Jika ya, kita melemparkan ValueTooLargeError kita dengan pesan khusus dan nilai aktual.

Menangani Pengecualian yang Didefinisikan oleh Pengguna

Menangani pengecualian yang didefinisikan oleh pengguna adalah sama seperti menangani pengecualian bawaan. Kita menggunakan blok try-except yang dapat dipercaya. Mari kita ekspand dari contoh sebelumnya:

def process_value(value):
try:
check_value(value)
except ValueTooLargeError as error:
print(f"Error: {error.message} The value {error.value} is not allowed.")
# Di sini kamu bisa menambahkan kode untuk menangani kesalahan, seperti meminta nilai baru
else:
print("Value processed successfully!")
finally:
print("Value checking complete.")

# Mari kita coba dengan nilai yang berbeda
process_value(50)
process_value(200)

Dalam kode ini, kita menggunakan blok try-except untuk menangani ValueTooLargeError kita. Kita juga menambahkan klausa else yang berjalan jika tidak ada pengecualian yang diangkat, dan klausa finally yang selalu berjalan, terlepas dari apakah terjadi pengecualian atau tidak.

Contoh Lengkap

Sekarang, mari kita gabungkan semua itu dalam contoh yang lebih kompleks. Bayangkan jika kita membuat sistem perbankan sederhana:

class InsufficientFundsError(Exception):
def __init__(self, balance, amount):
self.balance = balance
self.amount = amount
self.message = f"Insufficient funds. Balance: ${balance}, Attempted withdrawal: ${amount}"

class NegativeAmountError(Exception):
def __init__(self, amount):
self.amount = amount
self.message = f"Cannot process negative amount: ${amount}"

class BankAccount:
def __init__(self, balance=0):
self.balance = balance

def deposit(self, amount):
if amount < 0:
raise NegativeAmountError(amount)
self.balance += amount
print(f"Deposited ${amount}. New balance: ${self.balance}")

def withdraw(self, amount):
if amount < 0:
raise NegativeAmountError(amount)
if amount > self.balance:
raise InsufficientFundsError(self.balance, amount)
self.balance -= amount
print(f"Withdrew ${amount}. New balance: ${self.balance}")

# Mari kita gunakan kelas BankAccount kita
account = BankAccount(100)

try:
account.deposit(50)
account.withdraw(30)
account.withdraw(200)  # Ini harus melemparkan InsufficientFundsError
except NegativeAmountError as error:
print(f"Error: {error.message}")
except InsufficientFundsError as error:
print(f"Error: {error.message}")
else:
print("All transactions completed successfully.")
finally:
print(f"Final balance: ${account.balance}")

Dalam contoh ini, kita telah membuat kelas BankAccount dengan metode deposit dan withdraw. Kita juga telah definisikan dua pengecualian khusus: InsufficientFundsError dan NegativeAmountError.

Ketika kita mencoba untuk menarik lebih banyak uang daripada yang kita miliki di akun, itu melemparkan InsufficientFundsError. Jika kita mencoba untuk mendeposit atau menarik jumlah negatif, itu melemparkan NegativeAmountError.

Ini adalah contoh yang bagus tentang bagaimana pengecualian yang didefinisikan oleh pengguna dapat membuat kode kita lebih dapat dibaca dan membantu kita menangani kasus kesalahan spesifik dengan jelas dan terorganisir.

Kesimpulan

Selamat! Kamu baru saja meningkatkan keterampilan Python kamu dengan belajar tentang pengecualian yang didefinisikan oleh pengguna. Pengecualian khusus ini adalah seperti tentara pribadi kamu untuk menangkap kesalahan, siap untuk bertindak saat sesuatu yang tidak diharapkan terjadi di kode kamu.

Ingat, kunci untuk menguasai pengecualian yang didefinisikan oleh pengguna adalah praktek. Coba membuat pengecualian kamu sendiri untuk berbagai skenario, dan segera kamu akan menangani kesalahan seperti seorang pro!

Berikut adalah tabel referensi cepat tentang metode yang kita pelajari:

Method Deskripsi
class CustomError(Exception): Membuat kelas pengecualian baru
raise CustomError() Melemparkan pengecualian khusus
try: Memulai blok try
except CustomError as error: Menangkap pengecualian khusus tertentu
else: Berjalan jika tidak ada pengecualian yang diangkat
finally: Selalu berjalan, terlepas dari pengecualian

Selamat coding, dan semoga pengecualian kamu selalu ditangkap!

Credits: Image by storyset