Created
February 6, 2013 09:37
-
-
Save Raviyanto/4721432 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[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