Menguasai Exception Kustom Python: Panduan Praktis
Exception Kustom Python
Dalam tutorial ini, Anda akan mempelajari cara mendefinisikan exception kustom yang disesuaikan dengan kebutuhan, diilustrasikan dengan contoh praktis.
Python menyediakan banyak exception bawaan yang menyinyalikan error saat program menemui kondisi yang tidak terduga. Namun, ada kalanya bawaan tidak secara tepat menggambarkan masalah yang Anda hadapi. Dalam kasus tersebut, Anda dapat membuat tipe exception kustom Anda sendiri untuk membuat kode Anda lebih jelas dan lebih mudah dipelihara.
Membuat Exception Kustom
Mendefinisikan exception kustom di Python sederhana: buat kelas baru yang mewarisi dari kelas bawaan Exception (atau salah satu subclassnya). Sebagian besar exception standar berasal dari Exception, sehingga kelas kustom Anda akan terintegrasi dengan mulus dengan sistem penanganan error Python.
>>> class CustomError(Exception):
... pass
...
>>> raise CustomError
Traceback (most recent call last):
...
__main__.CustomError
>>> raise CustomError("An error occurred")
Traceback (most recent call last):
...
__main__.CustomError: An error occurred
Di sini, CustomError adalah exception yang ditentukan pengguna yang mewarisi dari Exception. Ia dapat dilemparkan dengan raise dan pesan opsional. Saat membangun proyek besar, praktik umum adalah menempatkan semua exception kustom dalam modul terpisah (misalnya, exceptions.py atau errors.py) sehingga mereka mudah ditemukan dan dipelihara.
Contoh: Exception yang Ditetapkan Pengguna di Python
Program berikut menunjukkan bagaimana exception kustom dapat digunakan untuk memandu masukan pengguna. Programnya terus meminta pengguna memasukkan angka sampai mereka menebak nilai yang tersimpan. Program memberikan petunjuk—apakah tebakan terlalu tinggi atau terlalu rendah—dengan melempar exception yang disesuaikan.
# define Python user-defined exceptions
class Error(Exception):
"""Base class for other exceptions"""
pass
class ValueTooSmallError(Error):
"""Raised when the input value is too small"""
pass
class ValueTooLargeError(Error):
"""Raised when the input value is too large"""
pass
# the target number
number = 10
# keep asking until the guess is correct
while True:
try:
i_num = int(input("Enter a number: "))
if i_num < number:
raise ValueTooSmallError
elif i_num > number:
raise ValueTooLargeError
break
except ValueTooSmallError:
print("This value is too small, try again!")
print()
except ValueTooLargeError:
print("This value is too large, try again!")
print()
print("Congratulations! You guessed it correctly.")
Contoh eksekusi:
Enter a number: 12 This value is too large, try again! Enter a number: 0 This value is too small, try again! Enter a number: 8 This value is too small, try again! Enter a number: 10 Congratulations! You guessed it correctly.
Dalam contoh ini, kelas dasar Error menyediakan nenek moyang umum untuk dua tipe error spesifik. Pendekatan ini menjaga hierarki exception tetap jelas dan memungkinkan Anda untuk menangkap semua error terkait dengan satu klausa except Error jika diinginkan.
Menyesuaikan Kelas Exception
Exception kustom juga dapat menyimpan data tambahan atau menyajikan pesan yang lebih informatif. Ini memerlukan penggantian __init__ dan opsional __str__. Berikut ini mengilustrasikan skenario validasi gaji.
class SalaryNotInRangeError(Exception):
"""Exception raised for errors in the input salary.
Attributes:
salary -- input salary which caused the error
message -- explanation of the error
"""
def __init__(self, salary, message="Salary is not in (5000, 15000) range"):
self.salary = salary
self.message = message
super().__init__(self.message)
salary = int(input("Enter salary amount: "))
if not 5000 < salary < 15000:
raise SalaryNotInRangeError(salary)
Output
Enter salary amount: 2000 Traceback (most recent call last): File "<string>", line 17, in <module> raise SalaryNotInRangeError(salary) __main__.SalaryNotInRangeError: Salary is not in (5000, 15000) range
Dengan mengganti __init__, exception dapat membawa nilai yang melanggar. Jika Anda ingin representasi string kustom, ganti __str__ seperti yang ditunjukkan di bawah:
class SalaryNotInRangeError(Exception):
"""Exception raised for errors in the input salary.
Attributes:
salary -- input salary which caused the error
message -- explanation of the error
"""
def __init__(self, salary, message="Salary is not in (5000, 15000) range"):
self.salary = salary
self.message = message
super().__init__(self.message)
def __str__(self):
return f'{self.salary} → {self.message}'
salary = int(input("Enter salary amount: "))
if not 5000 < salary < 15000:
raise SalaryNotInRangeError(salary)
Output
Enter salary amount: 2000 Traceback (most recent call last): File "/home/user/untitled.py", line 20, in <module> raise SalaryNotInRangeError(salary) __main__.SalaryNotInRangeError: 2000 → Salary is not in (5000, 15000) range
Untuk penjelasan yang lebih dalam tentang pola penanganan exception, konsultasikan tutorial Python Exception Handling.
Untuk mempelajari lebih lanjut tentang merancang aplikasi yang andal, jelajahi Python Object-Oriented Programming.