Python - Pemantahan Pengecualian: Panduan untuk Pemula
Halo, pemrogram Python yang beraspiration! Hari ini, kita akan menyelam ke atas dunia yang menarik tentang pemantahan pengecualian. Jangan khawatir jika kamu baru mengenal programming – Saya akan membimbing kamu melalui konsep ini langkah demi langkah, seperti yang Saya lakukan untuk pelbagai pelajar dalam tahun-tahun pengajaran Saya. Jadi, ambil atas rakimu pilihan minuman kesukaan, dan mari kita melakukan perjalanan yang menarik ini bersama-sama!
Apa itu Pengecualian?
Sebelum kita mendalami pemantahan pengecualian, mari kita singgah untuk mengingatkan tentang apa itu pengecualian. Dalam Python, pengecualian adalah peristiwa yang terjadi semasa eksekusi program yang mengganggu aliran instruksi normal. Mereka seperti twist peristiwa yang tak dijangka dalam sebuah cerita – kadang-kadang mereka adalah hiccups kecil, dan kadang-kadang mereka adalah rintangan besar.
Pemantahan Pengecualian: efek Dominو
Sekarang, bayangkan jika kamu sedang mengatur barisan dominو. Ketika kamu kalahkan yang pertama, itu memicu reaksi rantai. Pemantahan pengecualian dalam Python bekerja secara serupa – satu pengecualian dapat membawa kepada yang lain, menciptakan rantai kesalahan.
Dasar-dasar Pemantahan Pengecualian
Mari kita mulai dengan contoh sederhana:
try:
file = open("nonexistent_file.txt", "r")
content = file.read()
number = int(content)
except FileNotFoundError as e:
print(f"Oops! File not found: {e}")
raise ValueError("Tidak dapat memproses isi file") from e
Dalam kode ini, kita mencoba untuk membuka file, membaca isinya, dan mengubahnya menjadi integer. tapi apakah jika file tidak ada? Mari kita pecahkan:
- Kita mencoba untuk membuka file yang tidak ada.
- Ini menyebabkan
FileNotFoundError
. - Kita tangkap kesalahan ini dan cetak pesan.
- Kita kemudian naikkan
ValueError
baru, mengikatkannya keFileNotFoundError
asli.
Ketika kamu menjalankan kode ini, kamu akan melihat kedua pengecualian dalam traceback, menunjukkan bagaimana satu yang membawa kepada yang lain. Itu seperti meninggalkan jejak roti untuk debugging!
Perintah raise ... from
: Menghubungkan Titik-titik
Perintah raise ... from
adalah racikan rahasia pemantahan pengecualian. Ini memungkinkan kita untuk menghubungkan satu pengecualian ke satu yang lain secara eksplisit. Mari lihat contoh lain:
def divide_numbers(a, b):
try:
return a / b
except ZeroDivisionError as e:
raise ValueError("Tidak dapat membagi dengan nol") from e
try:
result = divide_numbers(10, 0)
except ValueError as ve:
print(f"An error occurred: {ve}")
print(f"Original error: {ve.__cause__}")
Ini adalah apa yang terjadi:
- Kita definisikan fungsi
divide_numbers
yang mencoba untuk membagia
denganb
. - Jika
b
adalah nol, terjadiZeroDivisionError
. - Kita tangkap kesalahan ini dan naikkan
ValueError
baru, mengikatkannya ke kesalahan asli. - Dalam kode utama, kita tangkap
ValueError
dan cetak kesalahan baru serta penyebab asli.
Ini sangat berguna ketika kamu ingin memberikan konteks lebih tentang kesalahan tanpa kehilangan informasi tentang asalannya. Itu seperti menerjemahkan bahasa asing sambil menjaga teks asli untuk referensi.
Perintah raise ... from None
: Mulai dari Awal
Kadang-kadang, kamu mungkin ingin naikkan pengecualian baru tanpa mengikatkannya ke yang asli. Itu saat raise ... from None
menjadi berguna. Itu seperti memulai bab baru dalam cerita kesalahan kamu.
try:
# Some code that might raise an exception
raise ValueError("Original error")
except ValueError:
raise RuntimeError("An error baru occurred") from None
Dalam kasus ini, RuntimeError
akan dinaikkan tanpa ada tautan ke ValueError
asli. Ini berguna ketika kamu ingin menyembunyikan rincian implementasi atau menyederhanakan penanganan kesalahan.
Atribut __context__
dan __cause__
: Menghapus Lapisan-lapisan
Python menyediakan dua atribut khusus untuk pengecualian: __context__
dan __cause__
. Ini seperti tiket belakangstag untuk rantai pengecualian kamu.
-
__context__
: Ini menunjukkan pengecualian sebelumnya yang sedang ditangani ketika pengecualian baru diangkat. -
__cause__
: Ini menunjukkan pengecualian yang secara eksplisit diikat menggunakanraise ... from
.
Mari lihat mereka dalam aksi:
try:
try:
1 / 0
except ZeroDivisionError as e:
raise ValueError("Tidak dapat membagi dengan nol") from e
except ValueError as ve:
print(f"Value Error: {ve}")
print(f"Cause: {ve.__cause__}")
print(f"Context: {ve.__context__}")
Ketika kamu menjalankan kode ini, kamu akan lihat:
Value Error: Tidak dapat membagi dengan nol
Cause: pembagian oleh nol
Context: pembagian oleh nol
Dalam kasus ini, kedua __cause__
dan __context__
menunjuk ke ZeroDivisionError
yang sama, tapi dalam skenario yang lebih kompleks, mereka mungkin berbeda.
Metode Pemantahan Pengecualian: Referensi Cepat
Berikut adalah tabel ringkasan metode pemantahan pengecualian yang kita diskusikan:
Method | Description | Example |
---|---|---|
raise ... from e |
Mengikatkan pengecualian baru secara eksplisit ke yang ada | raise ValueError("New error") from original_error |
raise ... from None |
Naikkan pengecualian baru tanpa mengikat | raise RuntimeError("New error") from None |
exception.__cause__ |
Akses penyebab yang diikat secara eksplisit dari pengecualian | print(error.__cause__) |
exception.__context__ |
Akses konteks implisit dari pengecualian | print(error.__context__) |
Penutup: Kekuatan Pemantahan Pengecualian
Pemantahan pengecualian seperti menjadi detektif di kode kamu sendiri. Ini membantu kamu menelusuri jalan kesalahan, memberikan wawasan yang berharga untuk debugging dan penanganan kesalahan. Dengan menguasai konsep ini, kamu menambahkan alat yang kuat ke toolkit Python kamu.
Ingat, setiap pemrogram yang hebat pernah menjadi pemula. Terus latihan, tetap curious, dan jangan takut untuk membuat kesalahan – itulah cara kita belajar dan tumbuh. Happy coding, dan semoga pengecualian kamu selalu terikat baik!
Credits: Image by storyset