Error dan exception dapat menyebabkan kegagalan program atau perilaku tak terduga, dan Python memiliki seperangkat alat yang tangguh untuk meningkatkan stabilitas kode.
Error dan exception dapat menyebabkan perilaku tak terduga atau bahkan menghentikan eksekusi program. Python menyediakan berbagai fungsi dan mekanisme untuk menangani masalah ini dan meningkatkan ketangguhan kode. Dalam tutorial ini, kita akan mempelajari berbagai jenis error dan fungsi bawaan beserta contohnya.
Sebuah error adalah masalah kritis dalam kode yang umumnya tidak dapat dipulihkan saat runtime, seperti sintaks yang salah atau indentasi yang keliru.
Sebuah exception adalah peristiwa runtime yang mengganggu alur normal program tetapi dapat ditangkap dan ditangani, sehingga program bisa tetap berjalan.
Meskipun exception terjadi saat runtime, beberapa error seperti SyntaxError dan IndentationError ditangkap oleh parser sebelum program dijalankan.
Sederhananya, error adalah masalah kritis yang seharusnya tidak ditangkap oleh aplikasi normal, sedangkan exception adalah kondisi yang sebaiknya ditangkap oleh program.
Mari pelajari lebih jauh tentang error dan exception dengan melihat berbagai contoh. Untuk menjalankannya dengan mudah, Anda dapat membuat workbook DataLab secara gratis yang sudah terpasang Python dan berisi semua contoh kode.
Error di Python
Berikut adalah contoh syntax error di mana perintah return di luar fungsi tidak bermakna. Kita tidak seharusnya menangani error di dalam program. Sebagai gantinya, kita harus membuat fungsi yang mengembalikan string tersebut.
Input In [1]return"DataCamp"^
SyntaxError:'return' outside function
Didukung oleh
Kita telah membuat fungsi tetapi dengan indentasi yang salah. Kita tidak seharusnya menangani error indentasi saat runtime. Kita bisa memperbaikinya secara manual atau menggunakan alat pemformatan kode.
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
Input In [4],in<cell line:1>()---->1 test =1/0
ZeroDivisionError: division by zeroDidukung oleh
Exception NameError cukup umum terjadi ketika sebuah variabel tidak ditemukan. Kita juga dapat menangani exception ini, baik dengan mengganti variabelnya atau mencetak peringatan.
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Input In [5],in<cell line:1>()---->1 y = test
NameError
Didukung oleh
Exception Bawaan Python
Berikut adalah daftar exception default Python beserta deskripsinya:
AssertionError: muncul ketika pernyataan assert gagal.
EOFError: muncul ketika fungsi input() menemui kondisi end-of-file.
AttributeError: muncul ketika penetapan atau referensi atribut gagal.
TabError: muncul ketika indentasi berisi tab atau spasi yang tidak konsisten.
ImportError: muncul ketika impor modul gagal.
IndexError: terjadi ketika indeks dari suatu urutan berada di luar jangkauan
KeyboardInterrupt: muncul ketika pengguna menekan tombol interupsi (Ctrl + C atau Delete).
RuntimeError: terjadi ketika error tidak masuk ke kategori mana pun.
NameError: muncul ketika variabel tidak ditemukan dalam scope lokal maupun global.
MemoryError: muncul ketika program kehabisan memori.
ValueError: terjadi ketika operasi atau fungsi menerima argumen dengan tipe yang benar tetapi nilai yang salah.
ZeroDivisionError: muncul ketika Anda membagi suatu nilai atau variabel dengan nol.
SyntaxError: muncul dari parser ketika sintaks Python salah.
IndentationError: terjadi ketika ada indentasi yang salah.
SystemError: muncul ketika interpreter mendeteksi error internal.
Anda dapat menemukan daftar lengkap error dan exception di Python dengan membaca dokumentasi.
Pelajari tentang exception Python dengan mengikuti kursus Object-Oriented Programming in Python kami. Anda akan mempelajari cara membuat class serta memanfaatkan inheritance dan polymorphism untuk menggunakan ulang dan mengoptimalkan kode.
Penanganan Exception dengan try, except, else, dan finally
Setelah mempelajari tentang error dan exception, kita akan belajar menanganinya dengan menggunakan blok try, except, else, dan finally.
Lalu, apa yang dimaksud dengan menanganinya? Dalam keadaan normal, error ini akan menghentikan eksekusi kode dan menampilkan pesan error. Untuk membuat sistem yang stabil, kita perlu mengantisipasi error ini dan menyiapkan solusi alternatif atau pesan peringatan.
Pada bagian ini, kita akan mempelajari apa fungsi setiap blok dan bagaimana menggunakannya untuk menulis kode yang tangguh.
Pernyataan try dan except
Cara paling sederhana menangani exception di Python adalah dengan menggunakan blok try dan except.
Jalankan kode di bawah pernyataan try.
Ketika sebuah exception muncul, jalankan kode di bawah pernyataan except.
Alih-alih berhenti pada error atau exception, kode kita akan beralih ke solusi alternatif.
Contoh sederhana
Pada contoh pertama, kita akan mencoba mencetak variabel x yang tidak didefinisikan. Dalam keadaan normal, ini akan memunculkan error dan menghentikan eksekusi, tetapi dengan blok try dan except, kita dapat mengubah perilaku alur eksekusi.
Program akan menjalankan kode di bawah pernyataan try.
Karena kita tahu x belum didefinisikan, maka ia akan menjalankan pernyataan except dan mencetak peringatan.
try:print(x)except:print("An exception has occurred!")Didukung oleh
Pada contoh kedua, kita akan menggunakan beberapa pernyataan except untuk menangani beberapa jenis exception.
Jika exception ZeroDivisionError muncul, program akan mencetak "You cannot divide a value with zero."
Exception lainnya akan mencetak “Something else went wrong.”
Ini memungkinkan kita menulis kode yang fleksibel yang dapat menangani banyak exception sekaligus tanpa terhenti.
Catatan: Hindari menggunakan klausa except: tanpa menyebutkan tipe exception — ini akan menangkap semua hal, termasuk KeyboardInterrupt dan SystemExit, yang dapat membuat program Anda sulit dihentikan dan menyembunyikan bug yang tidak terkait. Selalu tangkap exception spesifik yang Anda harapkan, seperti except ZeroDivisionError:.
try:print(1/0)except ZeroDivisionError:print("You cannot divide a value with zero")except:print("Something else went wrong")Didukung oleh
Pada kode di bawah, kita membaca berkas CSV, dan ketika muncul exception FileNotFoundError, kode akan mencetak error dan pesan tambahan tentang berkas data.csv.
Ya, kita dapat mencetak pesan error default tanpa menghentikan eksekusi.
try:withopen('data.csv')asfile:
read_data =file.read()except FileNotFoundError as fnf_error:print(fnf_error)print("Explanation: We cannot load the 'data.csv' file")Didukung oleh
[Errno 2] No such fileor directory:'data.csv'
Explanation: We cannot load the 'data.csv'fileDidukung oleh
try dengan klausa else
Kita telah mempelajari try dan except, kini kita akan mempelajari pernyataan else.
Ketika pernyataan try tidak memunculkan exception, kode masuk ke blok else. Ini adalah penangkal atau opsi cadangan saat Anda memperkirakan bagian skrip akan menghasilkan exception. Umumnya digunakan pada bagian penyiapan singkat atau verifikasi di mana Anda tidak ingin error tertentu tersamarkan.
Catatan: Dalam blok try-except, Anda dapat menggunakan else setelah semua pernyataan except.
Contoh sederhana
Kita menambahkan pernyataan else pada contoh ZeroDivisionError. Seperti terlihat, ketika tidak ada exception, fungsi print di bawah pernyataan else dieksekusi, menampilkan hasilnya.
try:
result =1/3except ZeroDivisionError as err:print(err)else:print(f"Your answer is {result}")Didukung oleh
Mari belajar lebih lanjut dengan membuat fungsi sederhana dan mengujinya pada berbagai skenario.
Fungsi find_nth_value() memiliki argumen x (list) dan n (nomor indeks). Kita membuat blok try, except, dan else untuk menangani exception IndexError.
x =[5,8,9,13]deffind_nth_value(x,n):try:
result = x[n]except IndexError as err:print(err)else:print("Your answer is ", result)Didukung oleh
List x memiliki empat nilai, dan kita akan mengujinya untuk indeks ke-6 dan ke-2.
# Testing
find_nth_value(x,6)
find_nth_value(x,2)Didukung oleh
Pada n=6, exception IndexError muncul, dan kita melihat pesan error default “list index out of range.”
Pada n=2, tidak ada exception yang muncul, dan fungsi mencetak hasil di bawah pernyataan else.
list index out of range
Your answer is9Didukung oleh
Kata kunci finally di Python
Kata kunci finally dalam blok try-except selalu dieksekusi, terlepas dari ada atau tidaknya exception. Blok finally selalu berjalan setelah try, except, dan else, apa pun exception-nya. Ini sangat berguna untuk membersihkan resource dan menutup objek, khususnya menutup berkas.
Fungsi divide dibuat untuk menangani exception ZeroDivisionError dan menampilkan hasil ketika tidak ada exception. Apa pun hasilnya, ia akan selalu menjalankan finally untuk mencetak “Code by DataCamp” dalam warna hijau.
defdivide(x,y):try:
result = x/y
except ZeroDivisionError:print("Please change 'y' argument to non-zero value")except:print("Something went wrong")else:print(f"Your answer is {result}")finally:print("\033[92m Code by DataCamp\033[00m")Didukung oleh
Pada pengujian pertama, kita membagi 1 dengan 0, yang akan memunculkan exception ZeroDivisionError dan mencetak pesannya. Seperti terlihat, ada baris tambahan setelah pesan error.
Alih-alih integer, kita menambahkan string sebagai argumen kedua, yang memunculkan exception berbeda dari ZeroDivisionError, dengan pesan yang berbeda.
Dalam ketiga skenario, ada satu hal yang sama. Kode selalu menjalankan fungsi print di bawah pernyataan finally.
Jika Anda baru di Python dan ingin menulis kode seperti programmer sungguhan, coba jalur keahlian Python Programming kami. Anda akan belajar menulis kode efisien, fungsi Python, rekayasa perangkat lunak, unit testing, dan pemrograman berorientasi objek.
Penanganan Exception Bersarang di Python
Kita memerlukan penanganan exception bersarang ketika menyiapkan program untuk menangani beberapa exception secara berurutan. Misalnya, kita dapat menambahkan blok try-except lain di bawah pernyataan else. Jadi, jika pernyataan pertama tidak memunculkan exception, periksa pernyataan kedua dengan sisa kode.
Memodifikasi fungsi divide
Kita memodifikasi fungsi divide dari contoh sebelumnya dan menambahkan blok try-except bersarang di bawah pernyataan else. Jadi, jika tidak ada AttributeError, ia akan menjalankan else dan memeriksa kode baru untuk exception ZeroDivisionError.
defdivide(x,y):try:
value =50
x.append(value)except AttributeError as atr_err:print(atr_err)else:try:
result =[i / y for i in x]print( result )except ZeroDivisionError:print("Please change 'y' argument to non-zero value")finally:print("\033[92m Code by DataCamp\033[00m")Didukung oleh
Pada skenario pertama, kita memberikan list berisi empat nilai x dan penyebut 3. Skrip akan menambahkan 50 ke list, membagi setiap nilai dalam list dengan 3, dan menampilkan hasilnya.
Please change 'y' argument to non-zero value
Code by DataCampDidukung oleh
Contoh pengeditan berkas
Mari lihat contoh yang lebih praktis tentang memuat berkas, menulis teks, dan menutup berkas.
Fungsi file_editor() akan:
Memeriksa exception FileNotFoundError untuk fungsi open().
Jika exception luar tidak muncul, ia akan memeriksa exception untuk fungsi write().
Apa pun yang terjadi, setelah membuka berkas, ia akan menutup berkas dengan menjalankan pernyataan finally.
Jika pernyataan try luar memunculkan exception, ia akan mengembalikan pesan error dengan path berkas yang tidak valid.
deffile_editor(path,text):try:
data =open(path)try:
data.write(text)except:print("Unable to write the data. Please add an append: 'a' or write: 'w' parameter to the open() function.")finally:
data.close()except:print(f"{path} file is not found!!")Didukung oleh
Pada skenario pertama, kita memberikan path berkas dan teksnya.
path ="data.txt"
text ="DataLab: Share your data analysis in a cloud-based environment--no installation required."
file_editor(path,text)Didukung oleh
Exception dalam muncul, karena fungsi write() tidak dapat menambahkan teks.
Unable to write the data. Please add an append:'a'or write:'w' parameter to the open() function.Didukung oleh
Untuk mengatasi masalah ini, kita perlu mengubah baris ketiga dari data = open(path) menjadi data = open(path, 'a'). Ini akan memungkinkan kita menambahkan teks baru ke berkas.
Setelah menjalankan ulang fungsi, kita berhasil menambahkan teks ke berkas.
Penanganan exception bersarang tidak direkomendasikan karena membuat penanganan exception menjadi lebih kompleks; pengembang menggunakan beberapa blok try-except untuk membuat penanganan exception berurutan yang sederhana.
Catatan: Anda juga dapat menambahkan blok try-except bersarang di bawah pernyataan try atau except. Ini tergantung pada kebutuhan Anda.
Menaikkan Exception di Python
Selain menangkap exception, Anda dapat secara sengaja menaikkannya menggunakan kata kunci raise. Ini berguna untuk menegakkan aturan bisnis atau validasi input. Ini memberikan sinyal bahwa ada sesuatu yang salah sebelum menyebabkan kegagalan yang lebih sulit dilacak di bagian hilir.
Untuk melempar exception, kita harus menggunakan kata kunci raise diikuti dengan nama exception.
Contoh menaikkan value error
Kita dapat menaikkan exception dengan menambahkan kata kunci raise dalam pernyataan if/else.
Pada contoh, kita menaikkan ValueError jika nilainya melebihi 1.000. Kita mengubah nilainya menjadi 2.000, yang membuat pernyataan if bernilai TRUE dan menaikkan ValueError dengan pesan kustom. Pesan error kustom membantu Anda menemukan masalah dengan cepat.
value =2_000if value >1_000:# raise the ValueErrorraise ValueError("Please add a value lower than 1,000")else:print("Congratulations! You are the winner!!")Didukung oleh
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)---->4raise ValueError("Please add a value lower than 1,000")5else:6print("Congratulations! You are the winner!!")
ValueError: Please add a value lower than 1,000Didukung oleh
Contoh menaikkan exception
Kita juga dapat menaikkan exception bawaan Python secara acak jika kondisinya terpenuhi. Dalam kasus kita, kita menaikkan Exception generik dengan pesan error.
if value >1_000:# raise the Exceptionraise Exception("Please add a value lower than 1,000")else:print("Congratulations! You are the winner!!")Didukung oleh
---------------------------------------------------------------------------
Exception Traceback (most recent call last)---->3raise Exception("Please add a value lower than 1,000")4else:5print("Congratulations! You are the winner!!")
Exception: Please add a value lower than 1,000Didukung oleh
Contoh menangani exception yang dinaikkan
Kita juga dapat membuat exception kustom dan menangani exception tersebut dengan menggunakan blok try-except.
Pada contoh, kita menambahkan contoh value error di bawah pernyataan try.
Lalu, bagaimana cara kerjanya? Alih-alih melempar exception dan menghentikan program, ini akan menampilkan pesan error yang kita berikan.
value =2_000try:if value >1_000:# raise the ValueErrorraise ValueError("Please add a value lower than 1,000")else:print("Congratulations! You are the winner!!")# if false then raise the value errorexcept ValueError as e:print(e)Didukung oleh
Jenis penanganan exception ini membantu kita bersiap menghadapi error yang tidak tercakup oleh Python dan spesifik untuk kebutuhan aplikasi Anda.
Selain menaikkan exception tersendiri, Anda dapat merantai exception menggunakan raise ... from. Ini mempertahankan exception asli sebagai konteks, membuat traceback jauh lebih jelas saat satu error menyebabkan error lainnya.
try:open("config.json")except FileNotFoundError as e:raise RuntimeError("App failed to start: config file missing")from eDidukung oleh
FileNotFoundError:[Errno 2] No such fileor directory:'config.json'
The above exception was the direct cause of the following exception:
RuntimeError: App failed to start: config file missingDidukung oleh
Bagian from e menetapkan atribut __cause__ pada exception baru, sehingga siapa pun yang membaca traceback dapat melihat dengan jelas apa yang memicunya. Ini sangat berguna dalam aplikasi besar di mana exception melintasi banyak lapisan kode.
Apa yang Baru di Python 3.10 - 3.13 untuk Penanganan Exception?
Beberapa pengembangan penting telah ditambahkan ke versi Python yang lebih baru seperti 3.10 dan 3.11 sejak artikel ini awalnya ditulis:
1. Structural pattern matching di Python 3.10
Python 3.10 memperkenalkan structural pattern matching, yang dapat digunakan untuk menangani exception dengan lebih elegan dengan mencocokkan tipe error dalam pernyataan match. Ini sangat berguna saat menangani banyak tipe exception dengan cara yang lebih mudah dibaca. Contoh:
try:
result =1/0except Exception as e:match e:case ZeroDivisionError():print("You cannot divide by zero.")case NameError():print("Variable not defined.")case_:print("An unexpected error occurred.")Didukung oleh
2. Lokasi error yang lebih rinci di traceback (Python 3.11)
Traceback di Python 3.11 kini menampilkan lokasi error yang presisi, sehingga lebih mudah men-debug exception.
Dengan Python 3.11, traceback menunjukkan sub-ekspresi tepat yang menyebabkan exception:
ZeroDivisionError: division by zero
(1+2)*(3/0)^Didukung oleh
3. Kelompok exception dan except* (Python 3.11)
Python 3.11 memperkenalkan kelompok exception untuk menangani beberapa exception dalam satu blok menggunakan except*. Ini berguna untuk mengelola kode asinkron atau skenario di mana beberapa exception mungkin muncul. Contoh:
try:raise ExceptionGroup("Multiple errors",[ValueError("Bad value"), TypeError("Bad type")])except* ValueError as ve:print(f"Handling ValueError: {ve}")except* TypeError as te:print(f"Handling TypeError: {te}")Didukung oleh
4. Metode add_note untuk exception (Python 3.11)
Exception kini memiliki metode add_note(), yang memungkinkan pengembang menambahkan catatan kustom pada exception untuk membantu debugging. Contoh:
try:raise ValueError("Invalid input")except ValueError as e:
e.add_note("This happened while processing user input.")
e.add_note("Consider validating input before processing.")raiseDidukung oleh
ValueError: Invalid input
Notes:- This happened while processing user input.- Consider validating input before processing.Didukung oleh
5. PEP 654: Penanganan exception bersarang yang lebih baik
Dengan kelompok exception, exception bersarang kini lebih mudah di-debug dan ditangani, khususnya pada alur kerja kompleks seperti multiprocessing atau tugas asinkron.
6. Pesan error yang disempurnakan (Python 3.12)
Python 3.12 melanjutkan upaya jangka panjang untuk membuat pesan error lebih spesifik dan dapat ditindaklanjuti. Misalnya, pesan NameError kini menyarankan variabel serupa yang berada dalam scope, dan error atribut pada tipe umum memberikan petunjuk yang lebih terarah:
# Python 3.12+
my_list =[1,2,3]
my_list.appendd(4)Didukung oleh
AttributeError:'list'object has no attribute 'appendd'. Did you mean:'append'?Didukung oleh
7. Traceback berwarna (Python 3.13)
Python 3.13 memperkenalkan traceback berwarna secara default di interpreter interaktif. Jenis error, nomor baris, dan pesan kini disorot dengan warna berbeda, sehingga jauh lebih cepat memindai dan memahami apa yang salah — terutama pada traceback panjang dengan banyak exception berantai.
Kesimpulan
Baik unit testing maupun penanganan exception adalah bagian inti dari pemrograman Python yang membuat kode Anda siap produksi dan tahan error. Dalam tutorial ini, kita telah mempelajari exception dan error di Python serta cara menanganinya. Selain itu, kita mempelajari blok try-except bersarang yang kompleks dan membuat blok exception kustom sesuai kebutuhan.
Alat dan mekanisme ini sangat penting, tetapi sebagian besar pekerjaan dilakukan melalui blok try dan except yang sederhana. Di mana try mencari exception yang dipicu oleh kode dan except menangani exception tersebut.
Jika ini terasa membingungkan dan Anda tidak tahu harus mulai dari mana, selesaikan kursus Introduction to Functions in Python kami untuk memahami scoping, fungsi lambda, dan penanganan error. Anda juga dapat mendaftar di jalur karier Python Programmer untuk memperoleh keterampilan pengembangan karier dan menjadi pengembang Python profesional.
Sebagai data scientist tersertifikasi, saya bersemangat memanfaatkan teknologi mutakhir untuk menciptakan aplikasi machine learning yang inovatif. Dengan latar belakang kuat di pengenalan ucapan, analisis dan pelaporan data, MLOps, conversational AI, dan NLP, saya mengasah keterampilan dalam mengembangkan sistem cerdas yang berdampak nyata. Selain keahlian teknis, saya juga komunikator andal yang mampu menyederhanakan konsep kompleks menjadi bahasa yang jelas dan ringkas. Karena itu, saya menjadi blogger yang dicari di bidang data science, membagikan wawasan dan pengalaman kepada komunitas profesional data yang terus berkembang. Saat ini, saya berfokus pada pembuatan dan penyuntingan konten, bekerja dengan large language model untuk mengembangkan konten yang kuat dan menarik agar membantu bisnis dan individu memaksimalkan data mereka.
FAQ
Apa perbedaan antara error dan exception di Python?⌄
Error di Python umumnya merupakan masalah yang lebih serius yang mencegah program untuk melanjutkan, seperti syntax error, yang menunjukkan struktur kode tidak benar. Sementara itu, exception adalah kondisi yang mengganggu alur normal program tetapi dapat ditangani di dalam program menggunakan blok try-except, sehingga program dapat terus berjalan.
Dapatkah Anda menangkap beberapa exception dalam satu blok try-except?⌄
Ya, Python memungkinkan Anda menangkap beberapa exception dalam satu blok try-except dengan menggunakan tuple tipe exception. Contohnya: except (TypeError, ValueError):. Ini akan menangani baikTypeError maupun ValueError dalam blok yang sama.
Bagaimana cara membuat exception kustom di Python?⌄
Anda dapat membuat exception kustom dengan mendefinisikan class baru yang mewarisi dari class bawaan Exception. Contohnya:
Blok else dieksekusi jika blok try tidak memunculkan exception. Ini berguna untuk kode yang hanya harus dijalankan jika blok try berhasil, menjaga kode tetap bersih dan memisahkan penanganan error dari jalur eksekusi normal.
Mengapa blok finally penting dalam penanganan exception?⌄
Blok finally selalu dieksekusi, terlepas dari apakah exception muncul atau tidak. Biasanya digunakan untuk tindakan pembersihan, seperti menutup berkas atau melepaskan resource, guna memastikan tindakan tersebut dilakukan dalam kondisi apa pun.
Bagaimana cara menekan exception di Python?⌄
Anda dapat menekan exception dengan menggunakan manajer konteks contextlib.suppress. Ini memungkinkan Anda menentukan tipe exception yang harus diabaikan. Contohnya:
from contextlib import suppress
with suppress(FileNotFoundError):open('non_existent_file.txt')Didukung oleh
Apa yang terjadi jika exception tidak ditangkap dalam program Python?⌄
Jika sebuah exception tidak ditangkap, ia akan merambat ke atas call stack, dan jika tetap tidak tertangani, program akan dihentikan, mencetak traceback ke konsol yang menunjukkan di mana exception terjadi.
Bisakah Anda menaikkan kembali exception setelah menanganinya?⌄
Ya, Anda dapat menaikkan kembali exception menggunakan pernyataan raise tanpa argumen dalam blok except. Ini berguna saat Anda ingin mencatat error atau melakukan tindakan lain sebelum membiarkan exception merambat lebih jauh.
Apakah ada cara menangani semua exception di Python?⌄
Meskipun memungkinkan untuk menangkap semua exception menggunakan klausa except:, umumnya tidak direkomendasikan karena dapat menangkap exception yang tidak terduga dan menyulitkan debugging. Lebih baik menangkap exception spesifik atau menggunakan except Exception: untuk menghindari penangkapan exception yang menghentikan sistem seperti SystemExit dan KeyboardInterrupt.
Bagaimana membedakan antara syntax error dan runtime exception dari segi waktu kejadiannya?⌄
Syntax error terdeteksi saat compile time, artinya interpreter Python menangkap error ini sebelum program mulai dijalankan. Runtime exception terjadi selama eksekusi program ketika interpreter menemui operasi yang tidak dapat dilakukan, seperti pembagian dengan nol atau mengakses variabel yang tidak ada.
Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Error dan exception dapat menyebabkan perilaku tak terduga atau bahkan menghentikan eksekusi program. Python menyediakan berbagai fungsi dan mekanisme untuk menangani masalah ini dan meningkatkan ketangguhan kode. Dalam tutorial ini, kita akan mempelajari berbagai jenis error dan fungsi bawaan beserta contohnya.
Meskipun exception terjadi saat runtime, beberapa error seperti
SyntaxErrordanIndentationErrorditangkap oleh parser sebelum program dijalankan.Sederhananya, error adalah masalah kritis yang seharusnya tidak ditangkap oleh aplikasi normal, sedangkan exception adalah kondisi yang sebaiknya ditangkap oleh program.
Mari pelajari lebih jauh tentang error dan exception dengan melihat berbagai contoh. Untuk menjalankannya dengan mudah, Anda dapat membuat workbook DataLab secara gratis yang sudah terpasang Python dan berisi semua contoh kode.
Error di Python
Berikut adalah contoh syntax error di mana perintah return di luar fungsi tidak bermakna. Kita tidak seharusnya menangani error di dalam program. Sebagai gantinya, kita harus membuat fungsi yang mengembalikan string tersebut.
Kita telah membuat fungsi tetapi dengan indentasi yang salah. Kita tidak seharusnya menangani error indentasi saat runtime. Kita bisa memperbaikinya secara manual atau menggunakan alat pemformatan kode.
Exception di Python
Kita menjumpai
ZeroDivisionError(Exception). Kita dapat menanganinya saat runtime dengan menggunakan bloktrydanexcept.Exception
NameErrorcukup umum terjadi ketika sebuah variabel tidak ditemukan. Kita juga dapat menangani exception ini, baik dengan mengganti variabelnya atau mencetak peringatan.Exception Bawaan Python
Berikut adalah daftar exception default Python beserta deskripsinya:
AssertionError: muncul ketika pernyataan assert gagal.EOFError: muncul ketika fungsiinput()menemui kondisi end-of-file.AttributeError: muncul ketika penetapan atau referensi atribut gagal.TabError: muncul ketika indentasi berisi tab atau spasi yang tidak konsisten.ImportError: muncul ketika impor modul gagal.IndexError: terjadi ketika indeks dari suatu urutan berada di luar jangkauanKeyboardInterrupt: muncul ketika pengguna menekan tombol interupsi (Ctrl + C atau Delete).RuntimeError: terjadi ketika error tidak masuk ke kategori mana pun.NameError: muncul ketika variabel tidak ditemukan dalam scope lokal maupun global.MemoryError: muncul ketika program kehabisan memori.ValueError: terjadi ketika operasi atau fungsi menerima argumen dengan tipe yang benar tetapi nilai yang salah.ZeroDivisionError: muncul ketika Anda membagi suatu nilai atau variabel dengan nol.SyntaxError: muncul dari parser ketika sintaks Python salah.IndentationError: terjadi ketika ada indentasi yang salah.SystemError: muncul ketika interpreter mendeteksi error internal.Anda dapat menemukan daftar lengkap error dan exception di Python dengan membaca dokumentasi.
Pelajari tentang exception Python dengan mengikuti kursus Object-Oriented Programming in Python kami. Anda akan mempelajari cara membuat class serta memanfaatkan inheritance dan polymorphism untuk menggunakan ulang dan mengoptimalkan kode.
Penanganan Exception dengan try, except, else, dan finally
Setelah mempelajari tentang error dan exception, kita akan belajar menanganinya dengan menggunakan blok
try,except,else, danfinally.Lalu, apa yang dimaksud dengan menanganinya? Dalam keadaan normal, error ini akan menghentikan eksekusi kode dan menampilkan pesan error. Untuk membuat sistem yang stabil, kita perlu mengantisipasi error ini dan menyiapkan solusi alternatif atau pesan peringatan.
Pada bagian ini, kita akan mempelajari apa fungsi setiap blok dan bagaimana menggunakannya untuk menulis kode yang tangguh.
Pernyataan try dan except
Cara paling sederhana menangani exception di Python adalah dengan menggunakan blok
trydanexcept.Jalankan kode di bawah pernyataan
try.Ketika sebuah exception muncul, jalankan kode di bawah pernyataan
except.Alih-alih berhenti pada error atau exception, kode kita akan beralih ke solusi alternatif.
Contoh sederhana
Pada contoh pertama, kita akan mencoba mencetak variabel
xyang tidak didefinisikan. Dalam keadaan normal, ini akan memunculkan error dan menghentikan eksekusi, tetapi dengan bloktrydanexcept, kita dapat mengubah perilaku alur eksekusi.try.xbelum didefinisikan, maka ia akan menjalankan pernyataan except dan mencetak peringatan.Contoh multiple except statement
Pada contoh kedua, kita akan menggunakan beberapa pernyataan
exceptuntuk menangani beberapa jenis exception.ZeroDivisionErrormuncul, program akan mencetak "You cannot divide a value with zero."Ini memungkinkan kita menulis kode yang fleksibel yang dapat menangani banyak exception sekaligus tanpa terhenti.
Catatan: Hindari menggunakan klausa
except:tanpa menyebutkan tipe exception — ini akan menangkap semua hal, termasukKeyboardInterruptdanSystemExit, yang dapat membuat program Anda sulit dihentikan dan menyembunyikan bug yang tidak terkait. Selalu tangkap exception spesifik yang Anda harapkan, sepertiexcept ZeroDivisionError:.Contoh memuat berkas
Sekarang, mari lihat contoh yang lebih praktis.
Pada kode di bawah, kita membaca berkas CSV, dan ketika muncul exception
FileNotFoundError, kode akan mencetak error dan pesan tambahan tentang berkasdata.csv.Ya, kita dapat mencetak pesan error default tanpa menghentikan eksekusi.
try dengan klausa else
Kita telah mempelajari
trydanexcept, kini kita akan mempelajari pernyataanelse.Ketika pernyataan
trytidak memunculkan exception, kode masuk ke blokelse. Ini adalah penangkal atau opsi cadangan saat Anda memperkirakan bagian skrip akan menghasilkan exception. Umumnya digunakan pada bagian penyiapan singkat atau verifikasi di mana Anda tidak ingin error tertentu tersamarkan.Catatan: Dalam blok try-except, Anda dapat menggunakan
elsesetelah semua pernyataanexcept.Contoh sederhana
Kita menambahkan pernyataan
elsepada contohZeroDivisionError. Seperti terlihat, ketika tidak ada exception, fungsi print di bawah pernyataanelsedieksekusi, menampilkan hasilnya.Contoh IndexError dengan else
Mari belajar lebih lanjut dengan membuat fungsi sederhana dan mengujinya pada berbagai skenario.
Fungsi
find_nth_value()memiliki argumenx(list) dann(nomor indeks). Kita membuat bloktry,except, danelseuntuk menangani exceptionIndexError.List
xmemiliki empat nilai, dan kita akan mengujinya untuk indeks ke-6 dan ke-2.IndexErrormuncul, dan kita melihat pesan error default “list index out of range.”else.Kata kunci finally di Python
Kata kunci
finallydalam bloktry-exceptselalu dieksekusi, terlepas dari ada atau tidaknya exception. Blokfinallyselalu berjalan setelahtry,except, danelse, apa pun exception-nya. Ini sangat berguna untuk membersihkan resource dan menutup objek, khususnya menutup berkas.Fungsi
dividedibuat untuk menangani exceptionZeroDivisionErrordan menampilkan hasil ketika tidak ada exception. Apa pun hasilnya, ia akan selalu menjalankanfinallyuntuk mencetak “Code by DataCamp” dalam warna hijau.Pada pengujian pertama, kita membagi 1 dengan 0, yang akan memunculkan exception
ZeroDivisionErrordan mencetak pesannya. Seperti terlihat, ada baris tambahan setelah pesan error.Ketika kita menambahkan input yang valid, hasil ditampilkan dengan mengeksekusi blok
elsedanfinally.Alih-alih integer, kita menambahkan string sebagai argumen kedua, yang memunculkan exception berbeda dari
ZeroDivisionError, dengan pesan yang berbeda.Dalam ketiga skenario, ada satu hal yang sama. Kode selalu menjalankan fungsi print di bawah pernyataan
finally.Jika Anda baru di Python dan ingin menulis kode seperti programmer sungguhan, coba jalur keahlian Python Programming kami. Anda akan belajar menulis kode efisien, fungsi Python, rekayasa perangkat lunak, unit testing, dan pemrograman berorientasi objek.
Penanganan Exception Bersarang di Python
Kita memerlukan penanganan exception bersarang ketika menyiapkan program untuk menangani beberapa exception secara berurutan. Misalnya, kita dapat menambahkan blok try-except lain di bawah pernyataan
else. Jadi, jika pernyataan pertama tidak memunculkan exception, periksa pernyataan kedua dengan sisa kode.Memodifikasi fungsi divide
Kita memodifikasi fungsi
dividedari contoh sebelumnya dan menambahkan blok try-except bersarang di bawah pernyataanelse. Jadi, jika tidak adaAttributeError, ia akan menjalankanelsedan memeriksa kode baru untuk exceptionZeroDivisionError.Pada skenario pertama, kita memberikan list berisi empat nilai
xdan penyebut 3. Skrip akan menambahkan 50 ke list, membagi setiap nilai dalam list dengan 3, dan menampilkan hasilnya.Fungsi berhasil dieksekusi tanpa memunculkan exception apa pun.
Alih-alih list, kita memberikan integer pada argumen pertama, yang memunculkan
AttributeError.Pada skenario terakhir, kita memberikan list, tetapi 0 sebagai argumen kedua yang memunculkan exception
ZeroDivisionErrordi bawah pernyataanelse.Contoh pengeditan berkas
Mari lihat contoh yang lebih praktis tentang memuat berkas, menulis teks, dan menutup berkas.
Fungsi
file_editor()akan:FileNotFoundErroruntuk fungsiopen().write().finally.Pada skenario pertama, kita memberikan path berkas dan teksnya.
Exception luar muncul.
Untuk mengatasi exception file not found, kita harus membuat berkas
data.txtmenggunakan perintah Linuxecho.Setelah itu, jalankan ulang fungsi
file_editor().Exception dalam muncul, karena fungsi
write()tidak dapat menambahkan teks.Untuk mengatasi masalah ini, kita perlu mengubah baris ketiga dari
data = open(path)menjadidata = open(path, 'a'). Ini akan memungkinkan kita menambahkan teks baru ke berkas.Setelah menjalankan ulang fungsi, kita berhasil menambahkan teks ke berkas.
Penanganan exception bersarang tidak direkomendasikan karena membuat penanganan exception menjadi lebih kompleks; pengembang menggunakan beberapa blok
try-exceptuntuk membuat penanganan exception berurutan yang sederhana.Catatan: Anda juga dapat menambahkan blok
try-exceptbersarang di bawah pernyataantryatauexcept. Ini tergantung pada kebutuhan Anda.Menaikkan Exception di Python
Selain menangkap exception, Anda dapat secara sengaja menaikkannya menggunakan kata kunci
raise. Ini berguna untuk menegakkan aturan bisnis atau validasi input. Ini memberikan sinyal bahwa ada sesuatu yang salah sebelum menyebabkan kegagalan yang lebih sulit dilacak di bagian hilir.Untuk melempar exception, kita harus menggunakan kata kunci
raisediikuti dengan nama exception.Contoh menaikkan value error
Kita dapat menaikkan exception dengan menambahkan kata kunci raise dalam pernyataan
if/else.Pada contoh, kita menaikkan
ValueErrorjika nilainya melebihi 1.000. Kita mengubah nilainya menjadi 2.000, yang membuat pernyataanifbernilaiTRUEdan menaikkanValueErrordengan pesan kustom. Pesan error kustom membantu Anda menemukan masalah dengan cepat.Contoh menaikkan exception
Kita juga dapat menaikkan exception bawaan Python secara acak jika kondisinya terpenuhi. Dalam kasus kita, kita menaikkan Exception generik dengan pesan error.
Contoh menangani exception yang dinaikkan
Kita juga dapat membuat exception kustom dan menangani exception tersebut dengan menggunakan blok
try-except.Pada contoh, kita menambahkan contoh value error di bawah pernyataan
try.Lalu, bagaimana cara kerjanya? Alih-alih melempar exception dan menghentikan program, ini akan menampilkan pesan error yang kita berikan.
Jenis penanganan exception ini membantu kita bersiap menghadapi error yang tidak tercakup oleh Python dan spesifik untuk kebutuhan aplikasi Anda.
Exception chaining dengan raise ... from
Selain menaikkan exception tersendiri, Anda dapat merantai exception menggunakan
raise ... from. Ini mempertahankan exception asli sebagai konteks, membuat traceback jauh lebih jelas saat satu error menyebabkan error lainnya.Bagian
from emenetapkan atribut__cause__pada exception baru, sehingga siapa pun yang membaca traceback dapat melihat dengan jelas apa yang memicunya. Ini sangat berguna dalam aplikasi besar di mana exception melintasi banyak lapisan kode.Apa yang Baru di Python 3.10 - 3.13 untuk Penanganan Exception?
Beberapa pengembangan penting telah ditambahkan ke versi Python yang lebih baru seperti 3.10 dan 3.11 sejak artikel ini awalnya ditulis:
1. Structural pattern matching di Python 3.10
Python 3.10 memperkenalkan structural pattern matching, yang dapat digunakan untuk menangani exception dengan lebih elegan dengan mencocokkan tipe error dalam pernyataan
match. Ini sangat berguna saat menangani banyak tipe exception dengan cara yang lebih mudah dibaca. Contoh:2. Lokasi error yang lebih rinci di traceback (Python 3.11)
Traceback di Python 3.11 kini menampilkan lokasi error yang presisi, sehingga lebih mudah men-debug exception.
Sebelum Python 3.11:
Dengan Python 3.11, traceback menunjukkan sub-ekspresi tepat yang menyebabkan exception:
3. Kelompok exception dan except* (Python 3.11)
Python 3.11 memperkenalkan kelompok exception untuk menangani beberapa exception dalam satu blok menggunakan
except*. Ini berguna untuk mengelola kode asinkron atau skenario di mana beberapa exception mungkin muncul. Contoh:4. Metode add_note untuk exception (Python 3.11)
Exception kini memiliki metode
add_note(), yang memungkinkan pengembang menambahkan catatan kustom pada exception untuk membantu debugging. Contoh:5. PEP 654: Penanganan exception bersarang yang lebih baik
Dengan kelompok exception, exception bersarang kini lebih mudah di-debug dan ditangani, khususnya pada alur kerja kompleks seperti multiprocessing atau tugas asinkron.
6. Pesan error yang disempurnakan (Python 3.12)
Python 3.12 melanjutkan upaya jangka panjang untuk membuat pesan error lebih spesifik dan dapat ditindaklanjuti. Misalnya, pesan
NameErrorkini menyarankan variabel serupa yang berada dalam scope, dan error atribut pada tipe umum memberikan petunjuk yang lebih terarah:7. Traceback berwarna (Python 3.13)
Python 3.13 memperkenalkan traceback berwarna secara default di interpreter interaktif. Jenis error, nomor baris, dan pesan kini disorot dengan warna berbeda, sehingga jauh lebih cepat memindai dan memahami apa yang salah — terutama pada traceback panjang dengan banyak exception berantai.
Kesimpulan
Baik unit testing maupun penanganan exception adalah bagian inti dari pemrograman Python yang membuat kode Anda siap produksi dan tahan error. Dalam tutorial ini, kita telah mempelajari exception dan error di Python serta cara menanganinya. Selain itu, kita mempelajari blok try-except bersarang yang kompleks dan membuat blok exception kustom sesuai kebutuhan.
Alat dan mekanisme ini sangat penting, tetapi sebagian besar pekerjaan dilakukan melalui blok
trydanexceptyang sederhana. Di manatrymencari exception yang dipicu oleh kode danexceptmenangani exception tersebut.Jika ini terasa membingungkan dan Anda tidak tahu harus mulai dari mana, selesaikan kursus Introduction to Functions in Python kami untuk memahami scoping, fungsi lambda, dan penanganan error. Anda juga dapat mendaftar di jalur karier Python Programmer untuk memperoleh keterampilan pengembangan karier dan menjadi pengembang Python profesional.