Penanganan Kesalahan (Error Handling and Exception Handling)

 

Penanganan Kesalahan (Error Handling and Exception Handling)

Saat Anda membuat program, sering kali menemukan setidaknya dua jenis kesalahan berdasarkan kejadiannya.

  1. Kesalahan sintaks (syntax errors) atau sering disebut juga sebagai kesalahan penguraian (parsing errors). 
  2. Pengecualian (exceptions) atau sering disebut juga sebagai kesalahan saat beroperasi (runtime errors). 

Mari kita bahas satu per satu jenis kesalahan tersebut.


Kesalahan Sintaks (Syntax Errors)

Kesalahan sintaks (syntax errors) adalah jenis kesalahan yang terjadi ketika Python tidak mengerti perintah Anda. Ini mengakibatkan pesan kesalahan muncul sebelum program tersebut berjalan. 

Salah satu tipe kesalahan sintaks yang sering ditemui adalah kesalahan indentasi (IndentationError). Berikut contoh kodenya.

Pada contoh di atas, program memunculkan pesan error "IndentationError" karena seharusnya terdapat indentasi sebelum sintaks "print()". Perhatikan bahwa secara langsung Python menunjukkan baris indentasi dengan memberi tanda panah ke atas atau dikenal dengan caret "^".

Tipe kesalahan yang sering dijumpai selanjutnya adalah kesalahan sintaksis (SyntaxErrors). Berikut contoh kodenya.

Pada tipe kesalahan sintaksis (syntax errors) program akan memunculkan pesan error "SyntaxError". Program pun memberi petunjuk bahwa terdapat sintaks yang tidak valid berada di posisi i<3. Dapatkah Anda menemukan kesalahannya? Ya, kesalahannya adalah tidak terdapat tanda titik dua ":" setelah while statement.

Jika kita telaah lebih dalam, kedua contoh tersebut memiliki tipe kesalahan yang berbeda. Contoh pertama menampilkan kesalahan indentation error dan kedua adalah syntax error. Kemudian setelah penyebutannya terdapat pesan detail kesalahan atau keterangan yang diberikan, misalnya sintaks yang tidak valid.

Secara umum struktur kesalahan sintaks sebagai berikut.

dos:14b48ce8a54ad4d599a7491de67ecebb20230808092518.jpeg

Mari bedah satu per satu poin di atas.

  1. "<nama file>" merupakan file Python yang Anda eksekusi. Jika Anda menggunakan mode script melalui lokal komputer dan program Anda menghasilkan Error, pesan ini akan memunculkan nama script atau file Python Anda. 
  2. <nomor baris> merupakan nomor baris kode dalam file Anda yang mengalami kesalahan. 
  3. <baris kode> merupakan kode yang mengalami kesalahan dalam file Anda. 
  4. <tipe kesalahan> merupakan kelompok atau tipe kesalahan yang Anda alami, contohnya SyntaxError dan IndentationError.
  5. <pesan kesalahan> merupakan pesan detail kesalahan atau keterangan yang diberikan oleh program. Contohnya adalah “invalid syntax” dan “expected an indented block”.


Pengecualian (Exceptions)

Pengecualian adalah kesalahan yang terjadi ketika Python mengerti perintah Anda, tetapi mendapatkan masalah saat mengikutinya. Umumnya, pengecualian bisa terjadi ketika aplikasi sudah mulai beroperasi.

Jenis kesalahan ini paling sering ditemui ketika Anda membuat kode program yang kompleks. Meskipun kode atau ekspresi dari Python yang Anda tulis sudah benar, ada kemungkinan terjadi kesalahan ketika perintah tersebut dieksekusi. 

Mari lihat contoh kode pengecualian di bawah ini.

Contoh kode di atas merupakan tipe kesalahan yang menunjukkan bahwa program tersebut tidak mendefinisikan variabel "angka". Jenis kesalahan ini terjadi ketika Anda tidak melakukan deklarasi dan inisialisasi variabel, tetapi langsung memanggil variabel tersebut. Program juga menampilkan keterangan atau pesan detail setelah memberi tahu tipe kesalahannya. 

Mari lihat contoh pengecualian selanjutnya.

Pada contoh di atas, program memunculkan kesalahan karena variabel "bukan_angka" termasuk tipe data string. Di sisi lain, program berusaha melakukan operasi aritmetika yang mengharuskan kedua variabel atau operan bertipe data integer. Pesan tipe kesalahan yang dimunculkan adalah TypeError dengan keterangan atau pesan detailnya adalah "can only concatenate str (not "int") to str".

Jika Anda telaah lebih dalam, struktur pengecualian hampir sama dengan struktur kesalahan sintaks. Namun, terdapat perbedaan di sana, pengecualian memberikan pesan "traceback (most recent call last)". 

dos:9181b3980734dc06be53193562cc4ded20230808092519.jpeg

Pesan ini mengacu pada informasi yang ditampilkan ketika terjadi kesalahan atau pengecualian (exception). Pesan traceback ini menyediakan "jejak" dari kode yang dieksekusi sehingga Anda dapat melacak kembali jalur eksekusi program sebelum mencapai titik error.


Penanganan Pengecualian

Lalu, bagaimana menangani kesalahan atau pengecualian tersebut? Program Python yang Anda bangun dapat dilengkapi penanganan terhadap pengecualian dari tipe kesalahan yang Anda tentukan. Konsep ini dikenal dengan exceptions handling yang menggunakan pernyataan try-except untuk menangani pengecualian tersebut.

Mari lihat jenis pengecualian yang berbeda dari contoh sebelumnya. Kali ini, pengecualiannya adalah kesalahan pembagian angka dengan nol.

Pada contoh di atas, program memunculkan error karena melakukan operasi aritmetika pembagian dengan nilai nol. Kita tahu bahwa pembagian dengan nilai nol tidak bisa dilakukan karena tidak terdefinisikan (undefined). Perhatikan bahwa tipe pengecualian yang terjadi adalah "ZeroDivisionError".

Kita bisa lakukan penanganan terhadap pengecualian tersebut dengan menggunakan pernyataan try-except. Berikut strukturnya.

dos:8a53925cdfc7a613eed7d521c27993ee20230808092518.jpeg

Anda bisa simpan kode yang dibuat di dalam "try" statement. Kode tersebut merupakan barisan kode yang mungkin terjadi pengecualian. Ada pun statement "except" adalah statement yang akan digunakan ketika pengecualian tersebut terjadi. 

Sederhananya, program akan mencoba (try) mengeksekusi kode yang berada dalam try statement. Lalu jika terjadi pengecualian, kode yang berada pada except statement akan dieksekusi.

Mari lihat penerapannya pada contoh berikut.

Pada contoh di atas, program akan menjalankan try statement terlebih dahulu dengan mengeksekusi sintaks "print(1/z)". Kita tahu bahwa program tersebut akan mengalami error "ZeroDivisionError". Alih-alih program menampilkan pesan "ZeroDivisionError: division by zero", kita ingin program menampilkan teks "Anda tidak bisa membagi angka dengan nilai nol.”

Kita simpan pernyataan "ZeroDivisionError" setelah except statement. Dengan begini, kita memerintahkan program untuk mengeksekusi kode dalam except jika pengecualian "ZeroDivisionError" terjadi. Kode dalam except tersebut menampilkan pesan "Anda tidak bisa membagi angka dengan nilai nol."

Sebenarnya, struktur lengkap dari pernyataan try tidak hanya melibatkan except. Berikut adalah struktur lengkap pernyataan try.

dos:cfd96186e534784ecef67b7a32cf197a20230808092519.jpeg

Struktur lengkap seperti ini biasanya diterapkan ketika Anda membangun program atau aplikasi yang lebih kompleks. 

Pada try statement, program akan menjalankan blok kode yang mungkin terjadi pengecualian. Pada except statement, program akan mengeksekusi statement ini jika terjadi pengecualian. Pada else statement, program akan mengeksekusi statement ini jika tidak terjadi pengecualian. Pada finally statement, program akan mengeksekusi statement ini setelah semua pernyataan di atas terjadi.

Mari lihat contoh penerapannya di bawah ini, contoh tersebut merupakan program untuk menampilkan key dalam tipe data dictionary. Jenis pengecualian yang akan dilakukan adalah KeyError dan TypeError. Kita akan coba untuk mengakses value dictionary dari key yang tidak ada dan mencoba mengoperasikan value dictionary tersebut yang termasuk string dengan operasi aritmetika. Untuk pengingat, dictionary merupakan tipe data yang melibatkan key-value

Mari mulai dengan kondisi yang tidak menampilkan error.

Pada contoh di atas, langkah pertama yang dilakukan adalah melakukan inisialisasi variable "var_dict" dengan nilai dictionary. Lalu, kita mencoba mengakses value dari key "rata_rata". Program di atas tidak menimbulkan error karena kita memberikan sintaks yang benar untuk mengakses value berdasarkan key, yakni var_dict['rata_rata'].

Perlu diperhatikan bahwa else statement ikut dieksekusi disebabkan pengecualian tidak terjadi (Error Exception tidak ada). Selain itu, finally statement akan selalu dieksekusi baik jika ada pengecualian ataupun tidak.

Bagaimana membangkitkan KeyError dan TypeError? Perhatikan langkah berikut.

  1. Untuk membangkitkan KeyError, ubah kode "print(f"rata-rata adalah {var_dict['rata_rata']}") " dengan kode " print(f"rata-rata adalah {var_dict['ratarata']}")  ". Anda bisa langsung copy-paste kode tersebut. 
    1. Dengan mengubah kode tersebut, program akan menampilkan KeyError. Hal ini terjadi karena kita mengakses key "ratarata", padahal seharusnya adalah "rata_rata".
    2. Perhatikan bahwa else statement tidak dieksekusi, karena exception atau pengecualian terjadi. Hal ini dibuktikan dengan tidak adanya teks "Kode ini dieksekusi jika tidak ada exception".
  2. Untuk membangkitkan TypeError, ubah kode "print(f"rata-rata adalah {var_dict['rata_rata']}") " dengan kode " print(f"rata-rata adalah {var_dict['rata_rata']/2}")  ". Anda bisa langsung copy-paste kode tersebut. 
    1. Dengan mengubah kode tersebut, program akan menampilkan TypeError. Hal ini terjadi karena kita melakukan operasi aritmetika terhadap value dari key "rata_rata" yang merupakan tipe data string.
    2. Perhatikan bahwa else statement tidak dieksekusi, karena exception atau pengecualian terjadi. Hal ini dibuktikan dengan tidak adanya teks "Kode ini dieksekusi jika tidak ada exception".


Raise Exception

Jika sebelumnya kita menangani kesalahan yang TIDAK DISENGAJA, kali ini kita akan mempelajari cara menangani kesalahan yang DISENGAJA. Umumnya, ketika membuat kode program kita ingin membatasi program tersebut dengan kondisi tertentu.

Perlu diingat bahwa umumnya, raise digunakan bersamaan dengan if-else statement.

Misalnya, Anda ingin membuat kode program untuk menampilkan angka dari 1 hingga 10 berdasarkan input atau masukan pengguna. Namun, dalam program tersebut kita ingin mengontrol dengan cara berikut: jika user memberikan input berupa bilangan negatif, program akan memunculkan pesan error dengan keterangan "Bilangan negatif tidak diperbolehkan".

Mari lihat penerapannya di bawah ini. Asumsikan user memasukkan input berupa bilangan "-1".

Pada contoh di atas, kita menggunakan percabangan untuk melakukan evaluasi jika nilai variabel "var" adalah bilangan negatif (kurang dari 0), program akan menampilkan error dengan teks "Bilangan negatif tidak diperbolehkan". Selain itu, program akan mengeksekusi else statement jika nilai dari variabel "var" bukanlah bilangan negatif (lebih besar atau sama dengan 0).

Ke depannya, Anda bisa mengontrol flow program yang Anda bangun dengan melibatkan error dan exceptions handling. Terutama ketika Anda membangun program yang lebih kompleks.

Rangkuman Control Flow

Kita sudah berada di penghujung materi Control Flow. Sampai sejauh ini, Anda telah memiliki pemahaman mengenai berbagai jenis kontrol dalam pemrograman, seperti percabangan, perulangan, hingga penanganan kesalahan. Mari kita rangkum secara saksama.


Percabangan dan Ternary Operators


Percabangan

Dalam pemrograman, sebuah kode program dapat berjalan berdasarkan kondisi tertentu. Maknanya, Anda dapat memberikan instruksi berdasarkan "Jika-maka".

  1. Jika Anda tidak menyelesaikan kelas Memulai Pemrograman dengan Python, maka Anda tidak lulus dari kelas Memulai Pemrograman dengan Python.
  2. Jika variabel nama kurang dari dua, maka variabel tersebut tidak memenuhi kriteria kondisi.

Statement atau sintaks untuk melakukan percabangan sebagai berikut.

  1. If
    If adalah statement Python yang akan mengecek nilai variabel di dalamnya memenuhi kriteria suatu kondisi atau tidak. Jika memenuhi kriteria, kondisi tersebut bernilai true. Jika tidak memenuhi kriteria, kondisi akan bernilai false. Jika kondisi if bernilai true, kode yang berada dalam blok kode if akan dieksekusi.

    Struktur dari IF statement sebagai berikut.
    dos:343128e08dbe9bfee35b69caca9ada6620230808093353.jpegSebagai informasi tambahan, kita juga dapat menambahkan 'and' atau 'or' operator dalam kondisi percabangan. 
  1. Else
    Else adalah statement yang menjadi jalan keluar saat kondisi atau hasil evaluasi if statement bernilai false. Ini maksudnya, program akan menjalani blok kode if terlebih dahulu dan jika hasilnya adalah false, program akan menjalankan else statement sebagai jalan keluar atau kondisi terakhir.

    Jika kita gabungkan if dan else, struktur berikut dihasilkan.
    dos:94ecdca01e2bb3081bcb2d76691ab74a20230808093356.jpeg
  1. ELIF
    Elif merupakan kependekan dari else if dan alternatif untuk if bertingkat atau switch case. Elif statement berada di posisi setelah if. Anda dapat menambahkan elif statement lebih dari satu karena tidak dibatasi dan opsional.

    Struktur keseluruhan percabangan jika kita gabungkan antara if, elif, dan else sebagai berikut.
    dos:9a11c7d66f8332389eaa11633db379b020230808093354.jpeg


Ternary Operators

Ternary operators termasuk conditional expressions pada Python. Conditional expressions adalah bentuk ekspresi yang bertujuan untuk mengevaluasi kondisi dan mengembalikan nilai berdasarkan hasil evaluasinya. Anda bisa asumsikan bahwa ternary operators ini merupakan versi one-liner dari if dan else. 

Ada 2 tipe ternary sebagai berikut.

  1. Ternary Operators
    Ternary jenis ini adalah jenis expression yang umum digunakan. Struktur dari ternary operators sebagai berikut.
    dos:55b5beb1f21ff93e2191973de343e08120230808093353.jpeg
  1. Ternary Tuples
    Jenis ternary kedua adalah jenis ternary yang menggunakan tipe data tuples.
    dos:e41b88bfa485f7e06f1d926eb3daab3f20230808093353.jpeg


Perulangan

Perulangan adalah jenis kode program yang bertujuan untuk meningkatkan efektivitas program dalam membuat kode program berulang. Ada beberapa jenis perulangan dalam Python, yakni for, while, dan for bersarang.


For

For adalah sintaks dalam Python yang bersifat definite iteration. Definite iteration adalah sebuah proses iterasi atau perulangan yang jumlah pengulangannya ditentukan secara eksplisit sebelumnya.

 Format dari perulangan for sebagai berikut.

dos:4940bd73b8ab88d8c502cd649593e24820230808093351.jpeg

<iterable> merupakan segala object dalam Python yang dapat diiterasi seperti list, tuple, hingga string. Ada pula <var> merupakan variabel yang akan mengambil elemen berikutnya dari <iterable> setiap kali iterasi berjalan.


While

While adalah sintaks dalam Python yang bersifat indefinite iteration. Indefinite iteration adalah sebuah proses iterasi yang akan berhenti ketika memenuhi kondisi tertentu.

Format dari perulangan while sebagai berikut.

dos:168cdef5465f2254ad9c446142b4696c20230808093351.jpeg

Kondisi merupakan ekspresi yang akan dievaluasi dan menghasilkan nilai true atau false. Selama hasil evaluasi bernilai true, program akan terus berjalan hingga menghasilkan nilai false.

Namun, ada kondisi yang akan menyebabkan perulangan terus berjalan tanpa henti. Kondisi ini disebut dengan infinite loop, kebalikan dari indefinite loop. Kondisi infinite loop berarti kita melakukan perulangan yang tidak pernah memenuhi kondisi yang diinginkan. Contohnya ketika kita melakukan perulangan, tetapi tidak menambahkan increment di akhir kode.

  1. counter = 1
  2. while counter <= 5:
  3.     print(counter)


For Bersarang

Ketika Anda membuat perulangan, sering kali menemukan perulangan dalam perulangan atau disebut sebagai nested loop. 

Format dari nested loop sebagai berikut.

dos:ca8ab147da674c0c625021cd773ad24320230808093351.jpeg

Anda dapat asumsikan bahwa terdapat dua perulangan, yakni "perulangan luar" dan "perulangan dalam". Program akan melakukan "perulangan luar" terlebih dahulu, lalu akan melakukan "perulangan dalam". "variabel_luar" akan mengambil nilai dari "iterable_luar" sedangkan "variabel_dalam" akan mengambil nilai dari "iterable_dalam".


Kontrol Perulangan

  1. Break
    Break statement adalah pernyataan untuk menghentikan perulangan dan kemudian program akan otomatis keluar dari perulangan tersebut, lalu dilanjutkan dengan mengeksekusi blok perulangan selanjutnya.

    Jika Anda memiliki perulangan yang bertingkat seperti for bersarang, break akan menghentikan perulangan sesuai dengan tingkatan atau letak perulangannya berada.
  1. Continue
    Continue statement adalah pernyataan untuk membuat iterasi berhenti, kemudian melanjutkan ke iterasi berikutnya. Continue seolah mengabaikan pernyataan (statement) yang berada antara continue hingga akhir blok.
  1. Else setelah For
    Pada Python juga dikenal else setelah for dengan fungsinya untuk perulangan yang bersifat pencarian. Else setelah for ini bisa dikatakan sebagai memberikan jalan keluar program saat pencarian tidak ditemukan.

    Perlu diperhatikan oleh Anda, if dan else berkaitan walaupun berbeda blok. Pada else setelah for, statement else tidak akan dieksekusi saat if pernah sekali saja benar. Dengan kata lain, break dalam if harus tidak terjadi untuk memicu else setelah for.
  1. Else setelah While
    Berbeda dengan else setelah for, pada statement else setelah while, blok statement else akan selalu dieksekusi saat kondisi pada while menjadi salah
  1. Pass
    Pass statement adalah pernyataan yang digunakan jika Anda menginginkan sebuah pernyataan atau blok pernyataan (statement), tetapi tidak ada tindakan atau program tidak melakukan apa pun.

    Statement pass digunakan dalam situasi-situasi ketika Python memerlukan adanya pernyataan, tetapi tidak memiliki tindakan yang perlu dilakukan pada saat itu. Biasanya itu adalah kondisi ketika Anda membutuhkan placeholder untuk menunjukkan bahwa tidak ada operasi yang perlu dilakukan. Hal ini dapat membantu kita mengatur struktur kode secara rapi dan memungkinkan penambahan implementasi di kemudian hari. 
  1. List Comprehension
    List comprehension adalah cara untuk menghasilkan list baru berdasarkan list atau iterables yang telah ada sebelumnya. Sintaks dasarnya sebagai berikut.
    dos:d95d4d3ab118c3b561dfd0a60437934720230808093351.jpeg
    Catatan:
    1. new_list merupakan variabel yang dideklarasikan oleh Anda.
    2. expression merupakan ekspresi yang akan dijalankan seiring perulangan bernilai benar.
    3. for_loop_one_or_more_conditions merupakan perulangan for yang Anda definisikan. Contohnya adalah "for n in angka" yang ada pada contoh sebelumnya.

 

Penanganan Kesalahan (Error Handling and Exception Handling)

Saat Anda membuat program, sering kali menemukan setidaknya dua jenis kesalahan berdasarkan kejadiannya.

  1. Kesalahan sintaks (syntax errors) atau sering disebut juga sebagai kesalahan penguraian (parsing errors). 
  2. Pengecualian (exceptions) atau sering disebut juga sebagai kesalahan saat beroperasi (runtime errors).

 

Kesalahan Sintaks (Syntax Errors)

Kesalahan sintaks (syntax errors) adalah jenis kesalahan yang terjadi ketika Python tidak mengerti perintah Anda. Ini mengakibatkan pesan kesalahan muncul sebelum program tersebut berjalan.

Secara umum struktur kesalahan sintaks sebagai berikut.

dos:241fef0c93cf585ea923dc11ef63ca6520230808093351.jpeg

Berikut adalah penjelasan detail satu per satu terkait poin di atas.

  1. "<nama file>" merupakan file Python yang Anda eksekusi. Jika Anda menggunakan mode script melalui lokal komputer dan program Anda menghasilkan Error, pesan ini akan memunculkan nama script atau file Python Anda. 
  2. <nomor baris> merupakan nomor baris kode dalam file Anda yang mengalami kesalahan. 
  3. <baris kode> merupakan kode yang mengalami kesalahan dalam file Anda. 
  4. <tipe kesalahan> merupakan kelompok atau tipe kesalahan yang Anda alami, contohnya SyntaxError dan IndentationError.
  5. <pesan kesalahan> merupakan pesan detail kesalahan atau keterangan yang diberikan oleh program. Contohnya “invalid syntax” dan “expected an indented block”.


Pengecualian (Exceptions)

Pengecualian adalah kesalahan yang terjadi ketika Python mengerti perintah Anda, tetapi mendapatkan masalah saat mengikutinya. Umumnya, pengecualian bisa terjadi ketika aplikasi sudah mulai beroperasi.

Jenis kesalahan ini adalah kesalahan yang paling sering ditemui ketika Anda membuat kode program yang kompleks. Meskipun kode atau ekspresi dari Python yang Anda tulis sudah benar, ada kemungkinan terjadi kesalahan ketika perintah tersebut dieksekusi. 

Secara umum, struktur pengecualian sama seperti kesalahan sintaksis. Namun, hal yang menjadi pembeda adalah pada struktur pengecualian memberikan pesan "traceback (most recent call last)".

dos:e18e5eb3e504662f04f4cc8ac342cdd220230808093351.jpeg

Pesan ini mengacu pada informasi yang ditampilkan ketika terjadi kesalahan atau pengecualian (exception). Pesan traceback ini menyediakan "jejak" dari kode yang dieksekusi sehingga Anda dapat melacak kembali jalur eksekusi program sebelum mencapai titik error.


Penanganan Pengecualian

Untuk menyelesaikan setiap masalah pengecualian, kita dapat membangun kode program dalam menangani hal tersebut. 

Program Python yang Anda bangun dapat dilengkapi penanganan terhadap pengecualian dari tipe kesalahan yang Anda tentukan. Konsep ini dikenal dengan exceptions handling yang menggunakan pernyataan try-except untuk menangani pengecualian tersebut.

Secara keseluruhan, struktur lengkap dari penanganan pengecualian sebagai berikut.

dos:3b6fb67b0cf2d5e46eca76c9ef21a4b920230808093351.jpeg

Pada try statement, program akan menjalankan blok kode yang mungkin terjadi pengecualian. Pada except statement, program akan mengeksekusi statement ini jika terjadi pengecualian. Pada else statement, program akan mengeksekusi statement ini jika tidak terjadi pengecualian. Pada finally statement, program akan mengeksekusi statement ini setelah semua pernyataan di atas terjadi.


Raise Exception

Jika sebelumnya kita menangani kesalahan yang TIDAK DISENGAJA, kali ini kita akan mempelajari cara menangani kesalahan yang DISENGAJA. Umumnya, ketika membuat kode program kita ingin membatasi program tersebut dengan kondisi tertentu.

Perlu diingat bahwa umumnya, raise digunakan bersamaan dengan if-else statement.

Berikut adalah contoh penerapan raise statement untuk menangani kesalahan atau pengecualian yang disengaja.

  1. var = -1
  2. if var < 0:
  3.     raise ValueError("Bilangan negatif tidak diperbolehkan")
  4. else:
  5.     for i in range(var):
  6.         print(i+1)
  7.     
  8.  
  9. """
  10. Traceback (most recent call last):
  11.   File "/home/glot/main.py", line 3, in <module>
  12.     raise ValueError("Bilangan negatif tidak diperbolehkan")
  13. ValueError: Bilangan negatif tidak diperbolehkan

Bersambung ke: 

Fundamental Array Array

Comments

Popular posts from this blog

Ceritakan cerita saya:

Aplikasi/Gaming/Koding: NKHM Nusantara: