Skip to content

Instantly share code, notes, and snippets.

@Raviyanto
Created February 6, 2013 09:37
Show Gist options
  • Save Raviyanto/4721432 to your computer and use it in GitHub Desktop.
Save Raviyanto/4721432 to your computer and use it in GitHub Desktop.
[08:22] <fajran> ok mari kita mulai kuliah ke-empat kita kali ini
[08:23] <fajran> topik hari ini adalah exception dan operasi berkas
[08:23] <fajran> kode yg terlibat hari ini akan saya letakkan di sini https://github.com/fajran/uvt-python-2012/tree/master/P4
[08:23] <fajran> mari kita mulai dengan exception
[08:24] <fajran> exception itu singkatnya adalah fasilitas dari sebuah bahasa pemrograman untuk melakukan "loncat" karena sesuatu yang "tidak diharapkan"
[08:25] <fajran> contoh hal yang tidak diharapkan adalah pembagian angka dengan nilai nol
[08:25] == dotovr [dfffe305@gateway/web/freenode/ip.223.255.227.5] has joined #uvt
[08:25] <fajran> ini contohnya https://github.com/fajran/uvt-python-2012/blob/master/P4/01.py
[08:25] <fajran> coba buka python shell lalu tulis, misalnya, 1 / 0
[08:26] <fajran> >>> 1 / 0
[08:26] <fajran> Traceback (most recent call last):
[08:26] <fajran> File "<stdin>", line 1, in <module>
[08:26] <fajran> ZeroDivisionError: integer division or modulo by zero
[08:26] <fajran> nah di situ bisa dilihat kalau python mengeluarkan sebuah exception yang bernama ZeroDivisionError
[08:27] <fajran> contoh exception yang lain adalah menghapus berkas yang tidak bisa kita akses karena tidak punya permission
[08:28] <fajran> exception ini termasuk fitur dari sebuah bahasa pemrograman
[08:28] <fajran> tidak semua bahasa punya exception.. contoh yg punya itu Java, C++
[08:28] <fajran> yang tidak punya contohnya itu C
[08:29] <fajran> nah exception ini akan menghentikan alur eksekusi program
[08:29] <fajran> jadi kalau terjadi exception, program akan berhenti di tempat
[08:29] <fajran> supaya tidak terjadi hal ini, exception perlu kita tangkap
[08:29] <fajran> dan masalah yang terjadi perlu kita tangani
[08:30] <fajran> cara menangkap exception adalah dengan membungkus kode yang bisa mengeluarkan exception dengan blok try .. except
[08:30] <fajran> contohnya https://github.com/fajran/uvt-python-2012/blob/master/P4/02.py
[08:30] <fajran> try:
[08:30] <fajran> print 1 / 0
[08:30] <fajran> except ZeroDivisionError:
[08:30] <fajran> print "Tidak boleh ada pembagian dengan nol"
[08:30] <fajran> pada saat baris ke-2 dieksekusi, akan keluar exception ZeroDivisionError
[08:31] <fajran> namun berhubung kode tsb ada di dal am blok try-except yang exceptionnya ditangkap, maka setelah terjadi exception, barus ke-4 akan dieksekusi
[08:31] <fajran> bagaimana kalau exception yang terjadi tidak disebut di dalam except? maka exception akan lari terus ke atas dan kalau tidak ada yg menangkap, program akan berhenti
[08:35] <fajran> kita bisa menulis lebih dari satu exception yang mau ditangkap dengan cara membuat lebih dari satu "except" atau menyebut bbrp exception sekaligus dalam satu except
[08:35] <fajran> contohnya ada di https://github.com/fajran/uvt-python-2012/blob/master/P4/03.py
[08:35] <fajran> try:
[08:35] <fajran> print 1 / 0
[08:35] <fajran> except ZeroDivisionError:
[08:35] <fajran> print "Tidak boleh ada pembagian dengan nol"
[08:35] <fajran> except OSError:
[08:35] <fajran> print "Terjadi masalah saat mengakses berkas"
[08:35] <fajran> except (ValueError, TypeError), e:
[08:35] <fajran> print "Terjadi masalah: ", e
[08:35] <fajran> sampai di sini, ada yang mau nanya?
[08:36] <arifazik_> berarti ada banyak jenis except selain zerodivision pak?
[08:37] <fajran> iya pak
[08:37] <fajran> daftar exception bawaan python bisa dicek di http://docs.python.org/2/library/exceptions.html
[08:37] <fajran> di bagian bawah halaman tsb ada pohon exception
[08:37] <fajran> http://docs.python.org/2/library/exceptions.html#exception-hierarchy
[08:38] <fajran> exception itu dibuat dengan cara membuat kelas
[08:38] <fajran> hirarki di situ adalah hirarki kelas
[08:40] <arifazik_> zerodivisionerror ada dibawah arithmeticerror..
[08:41] <arifazik_> berarti kita juga bisa bikin except arithmeticerror juga pak..
[08:41] <fajran> bisa pak
[08:42] <fajran> jadi andai kita menangkap exception induk
[08:42] <fajran> maka kalau terjadi exception anak2nya, maka exception ini akan tertangkap juga
[08:43] <arifazik_> oke pak.
[08:44] <fajran> oke ada pertanyaan lagi?
[08:45] <satmo54> clear insya Allah pak
[08:46] <fajran> sip
[08:46] <fajran> skr mari kita coba membuat exception sendiri
[08:46] <fajran> ini contoh terlalu sederhana sih hehe https://github.com/fajran/uvt-python-2012/blob/master/P4/04.py
[08:46] <fajran> ada 2 hal yg diperlihatkan di sini: cara membuat exception dan cara mengeluarkan exception
[08:47] <fajran> membuat exception maksudnya membuat sebuah exception sendiri yg bisa kita gunakan untuk keperluan yang kita rancang sendiri
[08:47] <fajran> cara membuat exception persis sama dengan cara membuat kelas karena pada dasarnya exception adalah sebuah kelas/objek
[08:47] <fajran> semua exception buatan kita harus merpakan turunan dari kelas Exception
[08:48] <fajran> di contoh 04.py ini saya membuat sebuah exception bernama PembagianDenganNol yang merupakan turunan dari exception ZeroDivisionError
[08:48] <fajran> (emang ngga jelas nih ya contohnya xD)
[08:48] <fajran> nah, untuk melempar exception, kita gunakan kata "raise"
[08:49] <arifazik_> :)
[08:49] <fajran> yang pita "raise" adalah objek dari kelas exception
[08:49] <fajran> di fungsi bagi(a, b) tsb, kita cek apakah nilai b adalah 0
[08:50] <fajran> kalau iya, maka kita lembar sebuah exception dari kelas exception PembagianDenganNol
[08:50] <fajran> sebentar saya bikin contoh yg lain dulu..
[08:50] <arifazik_> oke pak..
[08:50] <fajran> kalau ada yg mau ditanyakan, silakan langsung saja
[08:52] <arifazik_> nanti hasil dari 04.py itu gmn pak?
[08:53] <fajran> coba saja pak
[08:53] <fajran> ini contoh yang lain https://github.com/fajran/uvt-python-2012/blob/master/P4/05.py
[08:54] <satmo54> punya saya ada ininya pak :
[08:54] <satmo54> Traceback (most recent call last):
[08:54] <satmo54> File "P4/04.py", line 10, in <module>
[08:54] <satmo54> print bagi(2, 0)
[08:54] <satmo54> File "P4/04.py", line 6, in bagi
[08:54] <satmo54> raise PembagianDenganNol()
[08:54] <satmo54> __main__.PembagianDenganNol
[08:54] <fajran> satmo54: nah itu artinya terjadi exception PembagianDenganNol
[08:54] <fajran> coba juga contoh 05.py
[08:54] <fajran> itu lebih rapi mestinya
[08:55] <fajran> jadi pas 05.py dijalankan, python akan meminta input 2 kali
[08:55] <fajran> nama pengirim dan penerima lagu
[08:55] <fajran> kalau pengirim dan penerimanya sama, maka akan ada exception yg terjadi
[08:55] <fajran> namun exception ini ditangkap dan pesan exceptionnya ditampilkan
[08:56] <arifazik_> awesome.. :)
[08:57] <Fird0s> kerennn pak ...
[08:58] <fajran> tolong kasih tau kalau ada yg belom jelas
[08:58] <arifazik_> except PengirimPenerimaSama, e:
[08:58] <fajran> ini saya bahas dikit ttg yg itu
[08:58] <Fird0s> pak saya mau tanya itu gimana cara pemakaian contructor dan descructor ...
[08:58] <fajran> di baris 12, sebuah *objek* dari exception kan dibuat
[08:58] <fajran> PengirimPenerimaSama(pengirim)
[08:58] <fajran> itu kan pada dasarnya membuat objek dari kelas
[08:58] <fajran> lalu objeknya dilempar dengan "raise"
[08:58] <fajran> nah pada except yang ada
[08:58] <fajran> except PengirimPenerimaSama, e:
[08:59] <fajran> si objek itu ditangkap di situ dan masuk ke variabel e
[08:59] <fajran> lulu objeknya di-print deh.. print 'Masalah terjadi:', e
[08:59] <fajran> Fird0s: python ngga punya destructor pak
[08:59] <fajran> Fird0s: constructor adalah method __init__(), pada objek dibuat maka method ini akan dipanggil
[09:00] <fajran> arifazik_: eh tadi pertanyaannya apa ya? :D
[09:00] <fajran> oiya, kelas di python bisa membuat sebuah method spesial bernama __str__
[09:01] <arifazik_> e nya pak agak gimana2 :)
[09:01] <arifazik_> agak kurang paham
[09:01] <fajran> method __str__ ini diharapkan untuk mengeluarkan sebuah string.. kalau sebuah objek di-print, maka keluaran dari method __str__ akan ditampilkan
[09:01] <fajran> arifazik_: variabel "e" itu adalah objek exception yang dilempar oleh raise
[09:02] <fajran> jadi katakanlah pengirim dan penerima berisi nilai yang sama
[09:02] <fajran> maka pada baris 12 kan akan ada pemanggilan raise
[09:02] <fajran> yang di-raise itu adalah sebuah objek dari kelas exception
[09:02] <fajran> nah objek ini akan dilempar sampai ke sebuah "except" yang bisa menangkapnya
[09:03] <fajran> si except ini bias mengambil objek exception yang dilempar tadi
[09:03] <fajran> dalam contoh 05.py, objek ini akan lari ke variabel e
[09:04] <fajran> ini kodenya saya ubah sedikit, mudah2an lebih jelas
[09:04] <fajran> https://github.com/fajran/uvt-python-2012/blob/master/P4/05b.py
[09:05] <fajran> jadi objek exception yg dibuat pada baris 12 akan dilempar di baris 13
[09:05] <fajran> lalu akan ditangkap oleh except di baris 24
[09:05] <fajran> objek dari baris 12 itu tadi akan dimasukkan ke variabel objek_exception_tertangkap
[09:05] <fajran> jadi format untuk penulisan "except" adalah seperti berikut
[09:06] <fajran> except NamaException, objek_exception_yang_terjadi:
[09:06] <fajran> kalau mau menangkap banyak exception sekaligus
[09:06] <fajran> except (ExceptionSatu, ExceptionDua, DanSeterusnya), objek_exception_yang_terjadi:
[09:06] <fajran> namun si objek exception ini ngga wajib diambil, maka bisa saja tidak dituliskan
[09:08] <fajran> except NamaException:
[09:09] <fajran> arifazik_: bagaimana pak?
[09:09] <arifazik_> iya pak.. minimal udah ada gmbaran :)
[09:10] <Fird0s> pak fajran saya belom mengerti di def __init__(self, nama)
[09:10] <Fird0s> kenapa harus ada __init__ pak ?
[09:11] == shellc0de [~shellc0de@118.97.95.73] has joined #uvt
[09:11] <fajran> Fird0s: itu kalau mau bikin constructor
[09:12] <fajran> dan dalam contoh ini, si contructor butuh 1 variabel yaitu nama
[09:13] <fajran> ada yang mau ditanyakan lagi ttg exception?
[09:13] == samudera_ [~shellc0de@118.97.95.77] has quit [Ping timeout: 255 seconds]
[09:14] == shellc0de has changed nick to samudera
[09:15] <arifazik_> clear pak.. nnti akan dipelajari lagi..
[09:17] <fajran> lanjut ke operasi berkas ya?
[09:17] <arifazik_> yup.
[09:17] <samudera> oke pak
[09:18] <satmo54> ok
[09:18] <fajran> operasi berkas yang mau saya bahas sekarang ini tentang baca tulis berkas
[09:18] <fajran> lebih spesifiknya, berkas teks
[09:19] <fajran> bagaimana cara baca dan bagaimana cara membuatnya
[09:19] <fajran> untuk operasi yang melibatkan berkas, tahapannya itu ada 3: buka, baca/tulis, tutup
[09:20] <fajran> untuk membuka berkas, python menyediakan fungsi open()
[09:20] <fajran> mengapa berkas perlu dibuka? yaa bayangkan saja kalau kita punya kertas yang ingin kita baca
[09:20] <fajran> atau tulis
[09:20] <fajran> maka kertas tsb harus kita pegang terlebih dahulu
[09:21] <fajran> nah membuka berkas bisa dibayangkan dengan tahapan mengambil lalu memegang kertas
[09:21] <fajran> setelah berkas dibuka, maka berkas ini siap dibaca atau ditulis
[09:22] <fajran> operasi yang bisa dilakukan (baca atau tulis) itu tergantung dengan bagaimana cara kita membuka berkas
[09:22] <fajran> setelah berkas dibaca atau ditulisi, maka berkas ini perlu kita tutup agar semua operasi benar2 diterapkan ke berkas tsb
[09:22] <fajran> (terutama untuk operasi tulis)
[09:22] <fajran> mari kita lanjut ke contoh dulu supaya jelas :D
[09:23] <fajran> https://github.com/fajran/uvt-python-2012/blob/master/P4/06.py
[09:24] <fajran> eh jangan yg itu deh
[09:25] <fajran> coba cek yg ini dulu https://github.com/fajran/uvt-python-2012/blob/master/P4/06b.py
[09:25] <fajran> baris pertama
[09:25] <fajran> berkas = open('05.py')
[09:25] <fajran> di situ kita membuka sebuah berkas bernama "05.py"
[09:26] <fajran> si berkas ini kemudian bisa kita akses melalui sebuah variabel bernama "berkas"
[09:26] <fajran> variabel (objek) ini memiliki sebuah method yaitu read() yang berguna untuk membaca semua isinya
[09:26] <fajran> isi_berkas = berkas.read()
[09:26] <fajran> nah baris di atas akan membaca seluruh isi berkas dan memasukkannya ke variabel isi_berkas
[09:27] <fajran> setelah selesai, jangan lupa untuk menutup si berkas yang dibuka dengan memanggil method close()
[09:27] <fajran> berkas.close()
[09:27] <fajran> kita bisa cek isi berkas yang dibaca dengan mencetak variabel isi_berkas tadi
[09:27] <fajran> print isi_berkas
[09:28] <fajran> ada yg mau bertanya tentang 06b.py?
[09:29] <arifazik_> bisa dipahami pak..
[09:30] <fajran> 06.py kita pinggirkan dulu tuk skr ya :D
[09:31] <fajran> nah mari kita lihat contoh tuk menulis berkas https://github.com/fajran/uvt-python-2012/blob/master/P4/07.py
[09:31] <fajran> ada satu hal yg berbeda dengan cara membuka berkas untuk dibaca
[09:32] <fajran> kalau kita mau membuka berkas untuk ditulisi, kita harus bilang ke fungsi open() kalau kita ingin menulis berkas yang dibuka tsb
[09:32] <fajran> caranya dengan menyebut "w" sebagai parameter kedua dari fungsi open()
[09:32] <fajran> (oiya, dokumentasi fungsi open() ada di http://docs.python.org/2/library/functions.html#open )
[09:32] <fajran> berkas = open('tulis.txt', 'w')
[09:32] <fajran> itu artinya kita membuka berkas bernama "tulis.txt" dengan mode "w" yang artinya buka untuk ditulisi
[09:33] <fajran> jika berkas tsb sudah pernah ada, maka isinya akan dihapus dan penulisan diulang lagi dari awal
[09:33] <fajran> kalau ingin melanjutkan berkas yang udah ada (dg kata lain: menambahkan isinya), kita harus membuka berkas dengan mode "a" alias append
[09:34] <fajran> kalau mode ini tidak ditulis, maka akan digunakan mode "r" yaitu read
[09:34] <fajran> lanjut ke baris berikutnya
[09:34] <fajran> berkas.write('satu\n')
[09:36] <fajran> objek dari open() ini puny fungsi write() yang digunakan untuk menulis sesuatu ke berkas yang dibuka
[09:36] <fajran> kalau sudah selesai, jangan lupa panggil close() untuk memastikan semua yang kita tulis sudah benar2 ditulis
[09:37] <fajran> berkas.close()
[09:37] <Fird0s> saya pernah buat gini pak fajran http://pastebin.com/jW7LcKaP
[09:38] <Fird0s> untuk bookmark no hape gitu
[09:38] <fajran> Fird0s: ya pak?
[09:38] <Fird0s> http://pastebin.com/jW7LcKaP
[09:38] <Fird0s> kalau saya make argument a, b mungkin lebih bagus ...
[09:39] <fajran> b itu untuk binary mode
[09:39] <fajran> salah satu perbedaan membuka berkas dalam mode binary dan teks itu ada pada saat penulisan new line
[09:39] <fajran> kalau di linux/mac, baris baru alias new line itu cuma menggunakan karakter \n saja
[09:39] <fajran> kalau di windows, yang digunakan adalah \r\n
[09:40] <Fird0s> b itu objek dari line 5 pak
[09:40] <fajran> kalau menulis berkas di windows dengan mode teks (bukan binary), maka setahu saya semua new line akan diubah ke \r\n
[09:40] <Fird0s> b = raw_input("Number: ")
[09:40] <fajran> ooo.. yaya.. maaf maaf
[09:40] == dotovr [dfffe305@gateway/web/freenode/ip.223.255.227.5] has quit [Ping timeout: 245 seconds]
[09:40] <fajran> salah tangkep :P
[09:40] == samudera [~shellc0de@118.97.95.73] has quit [Read error: Connection reset by peer]
[09:40] <Fird0s> ngopi dulu pak .... coding is pulen ... haha
[09:41] <fajran> ada yang mau nanya ttg 07.py?
[09:42] == samudera [~shellc0de@118.97.95.67] has joined #uvt
[09:43] <Fird0s> \n itu escape pak ya ?
[09:44] <fajran> \n itu escape character tuk membuat new line
[09:45] <Fird0s> oke pak :D
[09:45] == arifazik [~quassel@114.79.50.191] has joined #uvt
[09:46] == arifazik_ [~quassel@114.79.54.153] has quit [Ping timeout: 248 seconds]
[09:46] <fajran> ada pertanyaan lagi? kalau ngga, kita kembali ke contoh 06.py :D
[09:46] <fajran> https://github.com/fajran/uvt-python-2012/blob/master/P4/06.py
[09:46] <satmo54> kalo mau tambah mode a dimananya pak?
[09:47] <Fird0s> itu untuk looping pak ya ?
[09:48] <fajran> satmo54: open(nama_berkas, "a")
[09:48] <fajran> tuk contoh 06.py, di python itu punya sesuatu yang bernama iterator
[09:49] <fajran> jadi kalau kita punya sebuah objek yang berfungsi sebagai iterator, maka objek tersebut bisa kita masukkan ke dalam for loop
[09:50] <fajran> objek keluaran open() itu berfungsi sebagai iterator
[09:50] <fajran> iterator si berkas ini akan mengeluarkan baris-demi-baris yang ada dalam berkas yang dibuka
[09:50] <fajran> berkas = open('05.py')
[09:50] <fajran> for baris in berkas:
[09:51] <fajran> nah for loop di atas akan membaca berkas baris demi baris
[09:51] <fajran> nilai variabel "baris" akan berisi setiap baris yang ada dalam berkas
[09:51] <fajran> cara penggunaan berkas seperti ini sangat berguna kalau kita ingin membaca isi berkas baris per baris
[09:52] <fajran> pembahasan mengenai iterator sendiri saya rasa termasuk topik tingkat lanjut, jadi kita bicarakan saja nanti di lain waktu
[09:52] <fajran> dokumentasinya sendiri ada di http://docs.python.org/2/library/stdtypes.html#iterator-types
[09:54] <fajran> ada lagi kah yang mau nanya? saya mesti udahan dalam 5 menit
[09:55] <samudera> berkas = open('baris.01.py', 'baris.02.py')
[09:55] <samudera> pak
[09:55] <samudera> klu seperti itu
[09:56] <samudera> bisa kebaca dua2nya pak
[09:56] <fajran> samudera: ngga bisa pak
[09:56] <fajran> 2 berkas mesti dibuka di 2 tempat berbeda
[09:56] <fajran> berkas_satu = open("satu")
[09:56] <fajran> berkas_dua = open("dua")
[09:57] <samudera> paham pak
[09:58] <fajran> ada lagi?
[10:00] <fajran> maaf saya mesti udahan dulu.. lanjut di facebook aja ya? :)
[10:00] <fajran> terima kasih telah hadir di sesi kuliah hari ini.. selamat ngoprek :D
[10:00] <satmo54> oke pak :)
[10:00] <fajran> wassalamu 'alaikum wr wb
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment