Kesalahan & Eksepsi
Di dunia programming tidak lepas dengan yang namanya kesalahan. Kesalahan dibagi menjadi 3 jenis:
Kesalahan syntax
Kesalaha ini disebabkan oleh cara penulisan program yang tidak mengikuti kaidah yang benar sesuai bahasa permrograman yang digunakan. Contoh di python:
while 1 print "python"
Seharusnya ditulis seperti berikut
while 1:
print "python" ### Kesalahan pada saat eksekusi
kesalahan ini menyebabkan eksekusi segera dihentikan. Contoh kesalahan ini diantaranya pemasukan data yang salah (bukan bilangan) pada fungsi seperti input()
, atau contoh lainnya adalah pemberian index diluar jangkauan index list, atau membuka berkas yang sebenarnya tidak ada dalam disk.
Kesalahan logika
Kesalahan ini terdeteksi sewaktu script dieksekusi tetapi tidak menghentikan eksekusi script. Kesalahan seperti ini umumnya karena logika dalam script yang salah. Misal programmer yang seharusnya menuliskan bilangan phi 3.14 tetapi pada kenyataanya menuliskan 31.4 (human error), sehingga script yang seharusnya dapat menghitung luas lingkaran dengan benar menjadi salah.
Berbagai Eksepsi di python
Untuk melihat aneka eksepsi di python kita bisa menuliskan ini pada modus interaktif:
>>> dir(__builtins__) ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '_', '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin', 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']
Beberapa contoh-contoh error
Contoh pada saat IndexError terjadi
>>> d = [1, 2, 3]
>>> d[5]
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module> d[5]
IndexError: list index out of range
pada contoh tersebut variable list d tidak mengenal index 6, list d hanya mengenal index 0, 1 dan 2.
Contoh pada saat IOError terjadi
>>> f = open("NULL.txt")
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module> f = open("NULL.txt")
IOError: [Errno 2] No such file or directory: 'NULL.txt'
Pada contoh tersebut script tidak bisa membaca file dengan nama NULL.txt karena di dalam disk tidak ada file dengan nama seperti itu yang sudah disiapkan.
Contoh pada saat KeyboardInterrupt terjadi
>>> while True:
pass
Traceback (most recent call last):
File "<pyshell#26>", line 1, in <module> while True:
KeyboardInterrupt
pada contoh tersebut memperlihatkan eksekpsi KeyboardInterrupt (saya menekan tombol ctrl+C pada keyboard ketika program sedang proses loop).
Contoh pada saat KeyError terjadi
>>> kamus = {1:"satu", 2:"dua", 3:"tiga"}
>>> kamus[4]
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module> kamus[4]
KeyError: 4
Penyebab kesalahan diatas adalah key 4 yang tidak ada di dalam variabel dictionary.
Contoh pada saat NameError terjadi
>>> print abc
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module> print abc
NameError: name 'abc' is not defined
Error diatas memberitahukan bahwa variable abc belum didefinisikan sebelumnya
Contoh pada saat SyntaxError terjadi
>>> while True pass
SyntaxError: invalid syntax
Terjadi kesalahan syntax, seharusnya:
>>> while True: pass
Contoh pada saat TypeError terjadi
>>> t = (1,2,3)
>>> t[1] = 5
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
t[1] = 5
TypeError: 'tuple' object does not support item assignment
Kesalahan diatas disebabkan adanya pengubahan elemen pada tuple, kita tahu bahwa tuple merupakan struktur data yang immutable.
Contoh pada saat ValueError terjadi
>>> range(1,10,0)
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
range(1,10,0)
ValueError: range() step argument must not be zero
Kesalahan disebabkan argumen ketiga pada range(), dimana tidak boleh bernilai nol, contoh lain:
>>> int("a")
Traceback (most recent call last): File "<pyshell#8>", line 1, in <module> int("a") ValueError: invalid literal for int() with base 10: 'a'
Tipe data integer seharusnya berupa bilangan, bukan huruf ("a")
Contoh pada saat ZeroDivisionError terjadi
>>> 19/0
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module> 19/0
ZeroDivisionError: integer division or modulo by zero
Terjadi kesalahan pada pembagian bilangan dengan 0.
Penanganan Eksepsi
Program yang baik seharusnya dapat menangani eksepsi. Saya contohkan seperti ini:
Pada program anda diminta untuk memasukkan bilangan dari keyboard, anda tidak sengaja memasukkan 27o yang seharusnya 270, dan ketika kesalahan tersebut dieksekusi program langsung dihentikan.
mungkin terbayang jika anda harus menginput ulang sebuah data yang banyak dalam mode text base, dan pengangan eksepsi tidak diberikan, program anda mungkin akan segera dihapus dan diganti dengan yang lain.Program yang baik biasanya memberikan dialog eksepsi, contoh:
-------------------dialog program----------------------------
masukkan bilangan: 27o
input yang anda berikan bukan bilangan, silahkan input ulang.
masukkan bilangan: _
-------------------------------------------------------------
artinya user diberi kesempatan memberikan input yang valid ketika kesalahan pemberian input terjadi.
Format penanganan eksepsi
penanganan eksepsi dilakukan dengan menggunakan pernyataan try except
. Format sederhana nya adalah sebagai berikut:
try:
<pernyataan_pernyataan>
except [<nama_eksepsi>]:
<pernyataan_pernyataan_yang_dieksekusi_jika_ada_eksepsi>
[else:
<pernyataan_pernyataan_yang_dieksekusi_jika_tidak_ada_eksepsi>]
tanda di dalam []
bisa ada, bisa tidak.
contoh eksepsi dalam modus interaktif
>>> def bagi(x,y):
try:
print x / y
except:
print "terjadi pembagian dengan bilangan nol"
else:
print "pembagian berhasil dilakukan"
>>> bagi(6, 2)
3
pembagian berhasil dilakukan