Soal 1Apa yang dicetak kode berikut?try:
raise ValueError("NG")
print("A")
except ValueError as e:
print(e)
print("B")
Memunculkan Exception dengan raise / Kelas Exception Kustom
Pelajari cara melempar exception sendiri di Python dengan raise, lalu mendefinisikan kelas exception kustom.
Di artikel sebelumnya tentang try / except, kita melihat sisi penerima exception.
Artikel ini membahas raise — sisi pelempar, tempat kamu memunculkan exception sendiri. Ketika kamu memunculkan exception pada input yang tidak valid atau kondisi yang tidak terduga, pemanggil dijamin menyadarinya lewat try / except.
Dasar raise
Menulis raise ExceptionClass("pesan") memunculkan exception itu saat itu juga. Begitu raise dijalankan, sisa kode dilewati dan kontrol melompat ke except yang cocok.
Pesannya opsional, tapi menyertakan kenapa gagal memungkinkan penerima membacanya via except ... as e.
# Raise ValueError dan tangkap di sisi penerima
try:
raise ValueError("Umur tidak valid")
print("tidak pernah tercapai")
except ValueError as e:
print(f"Tertangkap: {e}")
# Output: Tertangkap: Umur tidak valid
# Semua exception bawaan bisa dipakai apa adanya
# Yang umum: ValueError / TypeError / KeyError / IndexError
Validasi dengan if + raise
raise paling sering dipakai untuk validasi input. Ketika if menemukan sesuatu yang tidak valid, segera raise dan kembalikan panggilan ke pemanggil. Ini teknik idiomatik di fungsi (dibahas kemudian), di mana raise di dalam fungsi memberi tahu pemanggil tentang argumen buruk.
Alur — jalur normal berjalan melaluinya; jalur abnormal raise dan berhenti — adalah pola inti validasi di kode produksi.
Periksa input satu kondisi per waktu; begitu ada yang gagal, raise dan berhenti. Hanya ketika setiap kondisi lolos, pemrosesan normal berlanjut. Karena raise pertama menang, urutan pemeriksaan menetapkan prioritasnya.
# Validasi harga produk: 0 atau di bawahnya adalah error
price = -500
try:
if price < 0:
raise ValueError(f"Harga harus 0 atau lebih (dapat: {price})")
if not isinstance(price, int):
raise TypeError(f"Harga harus integer (tipe didapat: {type(price).__name__})")
print(f"Terdaftar: {price}")
except ValueError as e:
print(f"Error nilai: {e}")
except TypeError as e:
print(f"Error tipe: {e}")
# Output: Error nilai: Harga harus 0 atau lebih (dapat: -500)
Panduan kasar untuk exception bawaan mana yang harus di-raise: pakai ValueError ketika nilainya salah, TypeError ketika jenis (tipe) tidak sesuai dengan yang diharapkan, dan KeyError / IndexError ketika key atau elemen target hilang dari dict atau list.
Mendefinisikan kelas exception kustom
Exception bawaan saja kadang membuat sulit untuk tahu validasi mana yang gagal. Mendefinisikan kelas exception sendiri memungkinkanmu menangkapnya dengan tepat di sisi except.
Bentuknya adalah class ErrorName(Exception): dengan pass (kosong) sebagai badannya — selesai. Kita akan membahas class secara mendalam di bab object-oriented programming yang akan datang, tapi untuk kelas exception satu baris ini sudah cukup.
# Definisikan exception kustom (1 baris sudah cukup)
class InvalidAgeError(Exception):
pass
class DuplicateUserError(Exception):
pass
registered_users = ["budi", "siti"]
new_user = "budi"
new_age = -1
try:
if new_age < 0:
raise InvalidAgeError(f"Umur harus 0 atau lebih: {new_age}")
if new_user in registered_users:
raise DuplicateUserError(f"Sudah terdaftar: {new_user}")
print(f"Terdaftar: {new_user}")
except InvalidAgeError as e:
print(f"Error umur: {e}")
except DuplicateUserError as e:
print(f"Error duplikat: {e}")
# Output: Error umur: Umur harus 0 atau lebih: -1
Exception kustom menetapkan Exception sebagai kelas parent
Exception di dalam tanda kurung menamai kelas parent-nya. Dengan menempatkan Exception di sana, kelas kustommu otomatis mendapat fitur exception standar — bisa membawa pesan, bisa ditangkap oleh except Exception yang umum, dan seterusnya. Mekanisme parent / child itu sendiri (pewarisan) dibahas di bab object-oriented programming, tapi satu baris ini sudah cukup untuk mendefinisikan exception.
Di artikel ini kamu belajar cara memunculkan exception sendiri dengan raise, pola if + raise untuk validasi, dan cara mendefinisikan kelas exception kustom dengan Exception sebagai parent.
Berikutnya, kita akan melihat def — yang sudah muncul beberapa kali — sebagai topik utama dan belajar cara mengemas dan memakai ulang logika dengan fungsi.
Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 2Exception bawaan mana yang paling tepat ketika nilai tidak valid?
Soal 3Apa manfaat terbesar memakai exception kustom class MyError(Exception): pass?