Langsung ke konten

Membangkitkan Exception di Python dengan raise

raise membangkitkan exception secara sengaja saat ada aturan yang dilanggar. Artikel ini membahas cara memakai raise dan membuat custom exception sederhana.

Belajar Python Level Basic
Belajar Python Level Basic
Advertisement

Artikel ini bagian dari seri Belajar Python Level Basic di hanifmu.com. Di artikel sebelumnya kita sudah membahas try, except, dan finally. Sekarang kita balik arah dan sengaja membuat error.

Selama ini exception selalu datang dari luar: input salah, file hilang, atau pembagian nol. Padahal kadang program sendiri tahu bahwa sesuatu tidak beres dan sebaiknya berhenti memberi tahu.

Kenapa Membangkitkan Exception?

Bayangkan sebuah function yang menghitung diskon. Kalau persentase yang diberikan negatif, hasilnya tidak masuk akal. Function itu bisa diam saja dan mengembalikan angka aneh, atau ia bisa menolak dengan tegas.

Menolak dengan tegas lebih baik. Exception memaksa pemanggil function untuk sadar bahwa ada masalah, bukan melanjutkan dengan data yang salah.

Kata kunci untuk ini adalah raise.

Memakai raise

raise membangkitkan exception secara sengaja:

def hitung_diskon(harga, persen):
    if persen < 0:
        raise ValueError("Persentase diskon tidak boleh negatif")
    return harga - (harga * persen / 100)

print(hitung_diskon(100000, 10))   # 90000.0
print(hitung_diskon(100000, -5))   # ValueError

Baris terakhir menghasilkan:

ValueError: Persentase diskon tidak boleh negatif

Pesan yang kita tulis sendiri muncul apa adanya. Ini jauh lebih jelas daripada membiarkan program menghasilkan angka yang salah.

raise bisa memakai exception bawaan Python seperti ValueError, TypeError, atau ValueError lain yang sesuai. Pilih jenis yang paling menggambarkan masalahnya.

def atur_umur(umur):
    if not isinstance(umur, int):
        raise TypeError("Umur harus berupa bilangan bulat")
    if umur < 0:
        raise ValueError("Umur tidak boleh negatif")
    return umur

raise Ulang

Di dalam blok except, kamu bisa membangkitkan kembali exception yang sedang ditangani. Ini berguna saat kamu ingin mencatat error, lalu membiarkannya diteruskan:

def baca_angka(teks):
    try:
        return int(teks)
    except ValueError:
        print(f"Gagal mengonversi '{teks}'")
        raise

baca_angka("abc")

Output:

Gagal mengonversi 'abc'
Traceback (most recent call last):
  ...
ValueError: invalid literal for int() with base 10: 'abc'

raise tanpa argumen di dalam except akan membangkitkan ulang exception yang sama, sehingga pemanggil di atasnya tetap tahu ada error.

Custom Exception

Python mengizinkan kita membuat jenis exception sendiri. Caranya dengan membuat class yang mewarisi Exception:

class SaldoTidakCukupError(Exception):
    pass

Nama class yang lengkap sebaiknya diakhiri Error agar mudah dikenali. Setelah didefinisikan, exception ini bisa dipakai seperti exception bawaan:

class SaldoTidakCukupError(Exception):
    pass

def tarik_saldo(saldo, jumlah):
    if jumlah > saldo:
        raise SaldoTidakCukupError(
            f"Saldo {saldo} tidak cukup untuk menarik {jumlah}"
        )
    return saldo - jumlah

print(tarik_saldo(50000, 20000))   # 30000
print(tarik_saldo(50000, 80000))   # SaldoTidakCukupError

Custom exception membuat kode lebih mudah dipahami. Dari namanya saja, pembaca langsung tahu masalahnya soal saldo, bukan sekadar ValueError yang umum.

Menangkap Custom Exception

Karena buatan sendiri, exception ini juga bisa ditangkap secara spesifik:

class SaldoTidakCukupError(Exception):
    pass

def tarik_saldo(saldo, jumlah):
    if jumlah > saldo:
        raise SaldoTidakCukupError("Saldo tidak cukup")
    return saldo - jumlah

try:
    sisa = tarik_saldo(50000, 80000)
except SaldoTidakCukupError as e:
    print(f"Transaksi gagal: {e}")

Output:

Transaksi gagal: Saldo tidak cukup

Pola ini membuat penanganan error lebih rapi karena jenis exceptionnya sudah menggambarkan konteks bisnis, bukan sekadar tipe data.

Custom Exception dengan Data Tambahan

Kamu bisa menambahkan atribut pada custom exception untuk membawa informasi lebih banyak:

class ValidasiError(Exception):
    def __init__(self, field, pesan):
        self.field = field
        self.pesan = pesan
        super().__init__(f"{field}: {pesan}")

def validasi(data):
    if "nama" not in data or not data["nama"]:
        raise ValidasiError("nama", "wajib diisi")
    if "umur" not in data or data["umur"] <= 0:
        raise ValidasiError("umur", "harus lebih dari nol")

try:
    validasi({"nama": "", "umur": 20})
except ValidasiError as e:
    print(f"Field bermasalah: {e.field}")
    print(f"Pesan: {e.pesan}")

Output:

Field bermasalah: nama
Pesan: wajib diisi

Dengan cara ini, penangan error bisa tahu persis bagian mana yang gagal tanpa harus mengurai teks pesan.

Kapan Sebaiknya Memakai raise?

Gunakan raise saat:

  • Argument yang diterima tidak sesuai aturan, misalnya nilai negatif untuk harga.
  • Operasi tidak bisa dilanjutkan dan melanjutkannya justru berbahaya.
  • Kamu ingin memberi pesan error yang jelas dan spesifik.
  • Kode perlu menandai pelanggaran aturan yang tidak bisa ditangkap oleh if biasa.

Hindari raise saat:

  • Kondisi bisa ditangani dengan if dan return nilai default yang wajar.
  • Exception dipakai untuk mengatur alur normal program.
  • Kamu hanya ingin menampilkan pesan ke pengguna, bukan menandai masalah nyata.

Kesalahan Umum Pemula

  • Memakai raise untuk alur normal — exception sebaiknya untuk situasi luar biasa, bukan pengganti if.
  • Pesan terlalu umum — “Error” tidak membantu; sebutkan apa yang salah dan nilainya.
  • Membuat custom exception untuk semua hal — pakai exception bawaan bila sudah cocok.
  • Lupa memanggil exception — raise ValueError tanpa kurung salah; tulis raise ValueError("pesan").
  • Menangkap custom exception dengan except Exception — penanganan jadi tidak spesifik.

Ringkasan

  • raise membangkitkan exception secara sengaja saat ada aturan yang dilanggar
  • Pilih jenis exception bawaan yang paling sesuai, seperti ValueError atau TypeError
  • raise tanpa argumen di dalam except membangkitkan ulang exception yang sedang ditangani
  • Custom exception dibuat dengan mewarisi Exception
  • Custom exception bisa membawa data tambahan lewat atribut
  • Gunakan raise untuk masalah nyata, bukan untuk mengatur alur normal

Langkah Selanjutnya

Kamu sudah bisa menangani error dari luar maupun menandai masalah dari dalam program. Selama ini semua data yang kita olah hanya hidup di memori dan hilang saat program ditutup.

Artikel selanjutnya membahas Membaca File di Python, cara mengambil data yang tersimpan di file agar bisa diolah kembali.