Belajar dengan membaca secara berurutan

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 raisesisi 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.

Alur raise → except
jalankan badan tryraise ValueError("...")(sisa try dilewati)except ValueError as ee menerima pesanlanjut berjalanlompat
# 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

Lakukan perjalanan terkecil antara raise dan try / except.

① Di dalam try, jalankan raise KeyError("user_id tidak ditemukan").

② Tangkap dengan except KeyError as e: dan cetak "Jenis: KeyError / Detail: {e}" dalam satu baris.

③ Setelah try / except, panggil print("Melanjutkan…") untuk mengonfirmasi program tidak berhenti.

(Penjelasan akan muncul setelah kamu menjalankan kode dengan benar.)

Python Editor

Jalankan kode untuk melihat output

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.

Alur validasi dengan if + raise
terima inputcond 1: nilai tidak valid?raise ValueError(...)cond 2: tipe tidak valid?raise TypeError(...)semua pemeriksaanlolosjalankan proses normalexceptpemanggil menangkapYaTidakYaTidak

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.

Validasi username.

① Definisikan user_name = "".

② Di dalam try, raise ValueError("Username wajib diisi") ketika user_name adalah string kosong, dan ValueError("Username harus 20 karakter atau kurang") ketika len(user_name) > 20. Jika keduanya tidak terjadi, cetak "Terdaftar: {user_name}".

③ Tangkap dengan except ValueError as e: dan cetak "Error input: {e}".

Python Editor

Jalankan kode untuk melihat output

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.

Mendefinisikan dan memakai kelas exception kustom
Exception(parent bawaan)class OutOfStockError(Exception): passraise OutOfStockError("stok habis")except OutOfStockError as e:tarik pesan notifikasi dari elanjut berjalanset sebagai parent (definisi)pakai tipe
# 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.

Buat exception "stok habis" khusus dan raise selama alur pembelian.

① Definisikan class OutOfStockError(Exception): pass.

② Siapkan stock = {"apel": 3, "roti": 0} dan want = "roti".

③ Di try, ketika stock[want] == 0, raise OutOfStockError(f"Stok habis: {want}"); selainnya cetak "Dibeli: {want}".

④ Tangkap dengan except OutOfStockError as e: dan cetak "Notifikasi: {e}".

Python Editor

Jalankan kode untuk melihat output

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.

QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Apa yang dicetak kode berikut?
try:
raise ValueError("NG")
print("A")
except ValueError as e:
print(e)
print("B")

Soal 2Exception bawaan mana yang paling tepat ketika nilai tidak valid?

Soal 3Apa manfaat terbesar memakai exception kustom class MyError(Exception): pass?