Materi
Exception bawaan seperti ValueError hanya menyebut jenis masalahnya secara umum. Program yang lebih besar butuh nama yang menyebut masalahnya sendiri, misalnya StokKurangError, supaya pemanggil bisa menangkap persis kesalahan itu tanpa ikut menangkap ValueError lain. Tutorial Python §8.6 menyebut exception buatan sendiri diturunkan dari kelas Exception, dan namanya umumnya diakhiri Error seperti exception bawaan. Kelasnya boleh kosong, atau menyimpan atribut yang dibutuhkan penangkapnya.
class SaldoKurangError(Exception):
def __init__(self, saldo, diminta):
super().__init__(f"saldo {saldo} kurang untuk {diminta}")
self.kurang = diminta - saldo
def tarik(saldo, jumlah):
if jumlah > saldo:
raise SaldoKurangError(saldo, jumlah)
return saldo - jumlah
try:
tarik(50000, 80000)
except SaldoKurangError as e:
print(e) # saldo 50000 kurang untuk 80000
print(e.kurang) # 30000raise menghentikan fungsi dan melempar objek exception ke pemanggil. except NamaError as e menangkapnya, dan e adalah objek itu lengkap dengan atributnya. Blok except dicocokkan dari atas ke bawah dan hanya yang pertama cocok yang dijalankan. Karena objek kelas turunan juga cocok dengan kelas induknya, blok untuk kelas yang lebih khusus ditulis lebih dulu.
Kapan dipakai: saat error tingkat rendah, misalnya ValueError dari int(), perlu diterjemahkan menjadi error yang bermakna bagi program. Tulis raise DataRusakError(...) from e di dalam blok except. Tutorial §8.5 menyebut ini exception chaining: error asalnya tersimpan di atribut __cause__ dan ikut tercetak di traceback, sehingga penyebab awalnya tidak hilang.