Sampai saat ini pesan kesalahan belum banyak disebutkan, tetapi jika Anda telah mencoba contoh-contohnya, Anda mungkin telah melihat beberapa. Ada (setidaknya) dua jenis kesalahan yang dapat dibedakan. kesalahan sintaksis dan pengecualian Show
8. 1. Kesalahan SintaksKesalahan sintaksis, juga dikenal sebagai kesalahan penguraian, mungkin merupakan jenis keluhan paling umum yang Anda dapatkan saat masih mempelajari Python >>> while True print('Hello world') File "<stdin>", line 1 while True print('Hello world') ^ SyntaxError: invalid syntax Parser mengulangi baris yang menyinggung dan menampilkan 'panah' kecil yang menunjuk ke titik paling awal di baris tempat kesalahan terdeteksi. Kesalahan disebabkan oleh (atau setidaknya terdeteksi pada) token yang mendahului tanda panah. dalam contoh, kesalahan terdeteksi pada fungsi, karena titik dua ( >>> while True: .. try: .. x = int(input("Please enter a number: ")) .. break .. except ValueError: .. print("Oops! That was no valid number. Try again...") ...7) hilang sebelum. Nama file dan nomor baris dicetak sehingga Anda tahu ke mana harus mencari jika input berasal dari skrip 8. 2. PengecualianBahkan jika sebuah pernyataan atau ekspresi benar secara sintaksis, itu dapat menyebabkan kesalahan ketika upaya dilakukan untuk mengeksekusinya. Kesalahan yang terdeteksi selama eksekusi disebut pengecualian dan tidak fatal tanpa syarat. Anda akan segera belajar cara menanganinya dalam program Python. Namun, sebagian besar pengecualian tidak ditangani oleh program, dan menghasilkan pesan kesalahan seperti yang ditampilkan di sini >>> 10 * (1/0) Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>> 4 + spam*3 Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'spam' is not defined >>> '2' + 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate str (not "int") to str Baris terakhir dari pesan kesalahan menunjukkan apa yang terjadi. Pengecualian datang dalam berbagai jenis, dan jenisnya dicetak sebagai bagian dari pesan. jenis dalam contoh adalah , dan. String yang dicetak sebagai tipe pengecualian adalah nama dari pengecualian bawaan yang terjadi. Ini berlaku untuk semua pengecualian bawaan, tetapi tidak harus benar untuk pengecualian yang ditentukan pengguna (walaupun ini adalah konvensi yang berguna). Nama pengecualian standar adalah pengidentifikasi bawaan (bukan kata kunci yang dicadangkan) Baris selanjutnya memberikan detail berdasarkan jenis pengecualian dan apa yang menyebabkannya Bagian sebelumnya dari pesan kesalahan menunjukkan konteks di mana pengecualian terjadi, dalam bentuk stack traceback. Secara umum ini berisi baris sumber daftar traceback tumpukan; mencantumkan pengecualian bawaan dan artinya 8. 3. Menangani PengecualianDimungkinkan untuk menulis program yang menangani pengecualian yang dipilih. Lihat contoh berikut, yang meminta input dari pengguna hingga integer yang valid telah dimasukkan, tetapi memungkinkan pengguna untuk menginterupsi program (menggunakan Control-C atau apa pun yang didukung oleh sistem operasi); >>> while True: .. try: .. x = int(input("Please enter a number: ")) .. break .. except ValueError: .. print("Oops! That was no valid number. Try again...") ..._ Pernyataan tersebut berfungsi sebagai berikut
Pernyataan mungkin memiliki lebih dari satu kecuali klausa, untuk menentukan penangan untuk pengecualian yang berbeda. Paling banyak satu penangan akan dieksekusi. Handler hanya menangani exception yang terjadi pada klausa try yang sesuai, bukan pada handler lain dari pernyataan ... except (RuntimeError, TypeError, NameError): ... pass2 yang sama. Sebagai contoh, sebuah klausa yang dapat menyebutkan beberapa pengecualian sebagai tupel dalam tanda kurung ... except (RuntimeError, TypeError, NameError): ... pass_ Kelas dalam klausa kompatibel dengan pengecualian jika itu adalah kelas yang sama atau kelas dasar daripadanya (tetapi tidak sebaliknya — klausa pengecualian yang mencantumkan kelas turunan tidak kompatibel dengan kelas dasar). Misalnya, kode berikut akan mencetak B, C, D dalam urutan tersebut class B(Exception): pass class C(B): pass class D(C): pass for cls in [B, C, D]: try: raise cls() except D: print("D") except C: print("C") except B: print("B")_ Perhatikan bahwa jika klausa kecuali dibalik (dengan class B(Exception): pass class C(B): pass class D(C): pass for cls in [B, C, D]: try: raise cls() except D: print("D") except C: print("C") except B: print("B")2 pertama), itu akan dicetak B, B, B — pencocokan pertama kecuali klausa dipicu Ketika pengecualian terjadi, itu mungkin memiliki nilai terkait, juga dikenal sebagai argumen pengecualian. Kehadiran dan jenis argumen bergantung pada jenis pengecualian Klausa kecuali dapat menentukan variabel setelah nama pengecualian. Variabel terikat pada contoh pengecualian yang biasanya memiliki atribut class B(Exception): pass class C(B): pass class D(C): pass for cls in [B, C, D]: try: raise cls() except D: print("D") except C: print("C") except B: print("B")3 yang menyimpan argumen. Untuk kenyamanan, tipe pengecualian bawaan mendefinisikan class B(Exception): pass class C(B): pass class D(C): pass for cls in [B, C, D]: try: raise cls() except D: print("D") except C: print("C") except B: print("B")4 untuk mencetak semua argumen tanpa mengakses class B(Exception): pass class C(B): pass class D(C): pass for cls in [B, C, D]: try: raise cls() except D: print("D") except C: print("C") except B: print("B")5 secara eksplisit >>> try: .. raise Exception('spam', 'eggs') .. except Exception as inst: .. print(type(inst)) # the exception instance .. print(inst.args) # arguments stored in .args .. print(inst) # __str__ allows args to be printed directly, .. # but may be overridden in exception subclasses .. x, y = inst.args # unpack args .. print('x =', x) .. print('y =', y) ... <class 'Exception'> ('spam', 'eggs') ('spam', 'eggs') x = spam y = eggs Keluaran class B(Exception): pass class C(B): pass class D(C): pass for cls in [B, C, D]: try: raise cls() except D: print("D") except C: print("C") except B: print("B")4 pengecualian dicetak sebagai bagian terakhir ('detail') dari pesan untuk pengecualian yang tidak tertangani adalah kelas dasar umum dari semua pengecualian. Salah satu subkelasnya, , adalah kelas dasar dari semua pengecualian non-fatal. Pengecualian yang bukan merupakan subkelas dari biasanya tidak ditangani, karena digunakan untuk menunjukkan bahwa program harus dihentikan. Mereka termasuk yang dimunculkan oleh dan yang dimunculkan ketika pengguna ingin menghentikan program dapat digunakan sebagai wildcard yang menangkap (hampir) semuanya. Namun, merupakan praktik yang baik untuk sespesifik mungkin dengan jenis pengecualian yang ingin kami tangani, dan untuk memungkinkan pengecualian yang tidak diharapkan menyebar di Pola penanganan yang paling umum adalah mencetak atau mencatat pengecualian, lalu memunculkannya kembali (memungkinkan penelepon untuk menangani pengecualian juga) import sys try: f = open('myfile.txt') s = f.readline() i = int(s.strip()) except OSError as err: print("OS error:", err) except ValueError: print("Could not convert data to an integer.") except Exception as err: print(f"Unexpected {err=}, {type(err)=}") raise Pernyataan … memiliki klausa lain opsional, yang, jika ada, harus mengikuti semua kecuali klausa. Berguna untuk kode yang harus dijalankan jika klausa try tidak memunculkan eksepsi. Sebagai contoh for arg in sys.argv[1:]: try: f = open(arg, 'r') except OSError: print('cannot open', arg) else: print(arg, 'has', len(f.readlines()), 'lines') f.close() Penggunaan klausa >>> try: .. raise Exception('spam', 'eggs') .. except Exception as inst: .. print(type(inst)) # the exception instance .. print(inst.args) # arguments stored in .args .. print(inst) # __str__ allows args to be printed directly, .. # but may be overridden in exception subclasses .. x, y = inst.args # unpack args .. print('x =', x) .. print('y =', y) ... <class 'Exception'> ('spam', 'eggs') ('spam', 'eggs') x = spam y = eggs_7 lebih baik daripada menambahkan kode tambahan ke klausa karena menghindari secara tidak sengaja menangkap pengecualian yang tidak dimunculkan oleh kode yang dilindungi oleh pernyataan ... except (RuntimeError, TypeError, NameError): ... pass2 … ... except (RuntimeError, TypeError, NameError): ... pass4 Penangan pengecualian tidak hanya menangani pengecualian yang muncul langsung di klausa try, tetapi juga yang terjadi di dalam fungsi yang dipanggil (bahkan secara tidak langsung) di klausa try. Sebagai contoh >>> def this_fails(): .. x = 1/0 ... >>> try: .. this_fails() .. except ZeroDivisionError as err: .. print('Handling run-time error:', err) ... Handling run-time error: division by zero 8. 4. Meningkatkan PengecualianPernyataan itu memungkinkan pemrogram untuk memaksa pengecualian tertentu terjadi. Sebagai contoh >>> raise NameError('HiThere') Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: HiThere Satu-satunya argumen untuk menunjukkan pengecualian yang akan diajukan. Ini harus berupa instance pengecualian atau kelas pengecualian (kelas yang berasal dari , seperti atau salah satu subkelasnya). Jika kelas pengecualian dilewatkan, itu akan secara implisit dipakai dengan memanggil konstruktornya tanpa argumen >>> 10 * (1/0) Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>> 4 + spam*3 Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'spam' is not defined >>> '2' + 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate str (not "int") to str0 Jika Anda perlu menentukan apakah pengecualian muncul tetapi tidak bermaksud untuk menanganinya, bentuk pernyataan yang lebih sederhana memungkinkan Anda untuk menaikkan kembali pengecualian >>> 10 * (1/0) Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>> 4 + spam*3 Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'spam' is not defined >>> '2' + 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate str (not "int") to str1 8. 5. Rantai PengecualianJika pengecualian yang tidak tertangani terjadi di dalam suatu bagian, pengecualian yang ditangani akan dilampirkan padanya dan disertakan dalam pesan kesalahan >>> 10 * (1/0) Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>> 4 + spam*3 Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'spam' is not defined >>> '2' + 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate str (not "int") to str2 Untuk menunjukkan bahwa pengecualian adalah konsekuensi langsung dari yang lain, pernyataan itu memungkinkan klausa opsional >>> 10 * (1/0) Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>> 4 + spam*3 Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'spam' is not defined >>> '2' + 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate str (not "int") to str_3 Ini bisa berguna saat Anda mengubah pengecualian. Sebagai contoh >>> 10 * (1/0) Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>> 4 + spam*3 Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'spam' is not defined >>> '2' + 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate str (not "int") to str_4 Itu juga memungkinkan penonaktifan rangkaian pengecualian otomatis menggunakan idiom import sys try: f = open('myfile.txt') s = f.readline() i = int(s.strip()) except OSError as err: print("OS error:", err) except ValueError: print("Could not convert data to an integer.") except Exception as err: print(f"Unexpected {err=}, {type(err)=}") raise9 >>> 10 * (1/0) Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>> 4 + spam*3 Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'spam' is not defined >>> '2' + 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate str (not "int") to str5 Untuk informasi lebih lanjut tentang mekanisme rantai, lihat 8. 6. Pengecualian Buatan PenggunaProgram dapat menamai pengecualiannya sendiri dengan membuat kelas pengecualian baru (lihat lebih lanjut tentang kelas Python). Pengecualian biasanya harus diturunkan dari kelas, baik secara langsung maupun tidak langsung Kelas pengecualian dapat didefinisikan yang melakukan apa pun yang dapat dilakukan kelas lain, tetapi biasanya tetap sederhana, seringkali hanya menawarkan sejumlah atribut yang memungkinkan informasi tentang kesalahan diekstraksi oleh penangan untuk pengecualian Sebagian besar pengecualian ditentukan dengan nama yang diakhiri dengan "Kesalahan", mirip dengan penamaan pengecualian standar Banyak modul standar menentukan pengecualian mereka sendiri untuk melaporkan kesalahan yang mungkin terjadi pada fungsi yang mereka tentukan 8. 7. Mendefinisikan Tindakan PembersihanPernyataan tersebut memiliki klausa opsional lain yang dimaksudkan untuk menentukan tindakan pembersihan yang harus dilakukan dalam semua keadaan. Sebagai contoh >>> 10 * (1/0) Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>> 4 + spam*3 Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'spam' is not defined >>> '2' + 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate str (not "int") to str6 Jika ada klausa, klausa for arg in sys.argv[1:]: try: f = open(arg, 'r') except OSError: print('cannot open', arg) else: print(arg, 'has', len(f.readlines()), 'lines') f.close()_2 akan dieksekusi sebagai tugas terakhir sebelum pernyataan selesai. Klausa for arg in sys.argv[1:]: try: f = open(arg, 'r') except OSError: print('cannot open', arg) else: print(arg, 'has', len(f.readlines()), 'lines') f.close()2 berjalan apakah pernyataan ... except (RuntimeError, TypeError, NameError): ... pass2 menghasilkan pengecualian atau tidak. Poin-poin berikut membahas kasus yang lebih kompleks ketika pengecualian terjadi
Sebagai contoh >>> 10 * (1/0) Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>> 4 + spam*3 Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'spam' is not defined >>> '2' + 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate str (not "int") to str7 Contoh yang lebih rumit >>> 10 * (1/0) Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>> 4 + spam*3 Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'spam' is not defined >>> '2' + 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate str (not "int") to str_8 Seperti yang Anda lihat, klausa dijalankan dalam peristiwa apa pun. Dibesarkan dengan membagi dua string tidak ditangani oleh klausa dan oleh karena itu dimunculkan kembali setelah klausa for arg in sys.argv[1:]: try: f = open(arg, 'r') except OSError: print('cannot open', arg) else: print(arg, 'has', len(f.readlines()), 'lines') f.close()2 telah dieksekusi Dalam aplikasi dunia nyata, klausa berguna untuk melepaskan sumber daya eksternal (seperti file atau koneksi jaringan), terlepas dari apakah penggunaan sumber berhasil atau tidak. 8. 8. Tindakan Pembersihan StandarBeberapa objek menentukan tindakan pembersihan standar yang harus dilakukan saat objek tidak lagi diperlukan, terlepas dari apakah operasi menggunakan objek berhasil atau gagal. Lihat contoh berikut, yang mencoba membuka file dan mencetak isinya ke layar >>> 10 * (1/0) Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>> 4 + spam*3 Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'spam' is not defined >>> '2' + 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate str (not "int") to str_9 Masalah dengan kode ini adalah membiarkan file terbuka untuk waktu yang tidak ditentukan setelah bagian kode ini selesai dijalankan. Ini bukan masalah dalam skrip sederhana, tetapi bisa menjadi masalah untuk aplikasi yang lebih besar. Pernyataan tersebut memungkinkan objek seperti file untuk digunakan dengan cara yang memastikan mereka selalu dibersihkan dengan cepat dan benar >>> while True: .. try: .. x = int(input("Please enter a number: ")) .. break .. except ValueError: .. print("Oops! That was no valid number. Try again...") ..._0 Setelah pernyataan dieksekusi, file f selalu ditutup, bahkan jika terjadi masalah saat memproses baris. Objek yang, seperti file, memberikan tindakan pembersihan yang telah ditentukan sebelumnya akan menunjukkan hal ini dalam dokumentasinya 8. 9. Memunculkan dan Menangani Beberapa Pengecualian yang Tidak TerkaitAda situasi di mana perlu melaporkan beberapa pengecualian yang telah terjadi. Ini sering terjadi dalam kerangka kerja konkurensi, ketika beberapa tugas mungkin gagal secara paralel, tetapi ada juga kasus penggunaan lain yang diinginkan untuk melanjutkan eksekusi dan mengumpulkan banyak kesalahan daripada memunculkan pengecualian pertama Builtin membungkus daftar instance pengecualian sehingga dapat dimunculkan bersama. Ini adalah pengecualian itu sendiri, sehingga dapat ditangkap seperti pengecualian lainnya >>> while True: .. try: .. x = int(input("Please enter a number: ")) .. break .. except ValueError: .. print("Oops! That was no valid number. Try again...") ..._1 Dengan menggunakan >>> 10 * (1/0) Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>> 4 + spam*3 Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'spam' is not defined >>> '2' + 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate str (not "int") to str_09 alih-alih ... except (RuntimeError, TypeError, NameError): ... pass4, kita hanya dapat menangani pengecualian dalam grup yang cocok dengan tipe tertentu secara selektif. Dalam contoh berikut, yang menunjukkan grup pengecualian bersarang, setiap klausa >>> 10 * (1/0) Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>> 4 + spam*3 Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'spam' is not defined >>> '2' + 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate str (not "int") to str09 mengekstrak dari pengecualian grup jenis tertentu sambil membiarkan semua pengecualian lainnya menyebar ke klausa lain dan akhirnya dinaikkan kembali >>> while True: .. try: .. x = int(input("Please enter a number: ")) .. break .. except ValueError: .. print("Oops! That was no valid number. Try again...") ..._2 Perhatikan bahwa pengecualian yang bersarang di grup pengecualian harus berupa instance, bukan tipe. Ini karena dalam praktiknya, pengecualian biasanya adalah pengecualian yang telah dimunculkan dan ditangkap oleh program, di sepanjang pola berikut >>> while True: .. try: .. x = int(input("Please enter a number: ")) .. break .. except ValueError: .. print("Oops! That was no valid number. Try again...") ..._3 8. 10. Memperkaya Pengecualian dengan CatatanSaat pengecualian dibuat untuk dimunculkan, biasanya diinisialisasi dengan informasi yang menjelaskan kesalahan yang terjadi. Ada kasus di mana berguna untuk menambahkan informasi setelah pengecualian tertangkap. Untuk tujuan ini, pengecualian memiliki metode >>> 10 * (1/0) Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>> 4 + spam*3 Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'spam' is not defined >>> '2' + 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate str (not "int") to str12 yang menerima string dan menambahkannya ke daftar catatan pengecualian. Render traceback standar menyertakan semua catatan, sesuai urutan penambahannya, setelah pengecualian >>> while True: .. try: .. x = int(input("Please enter a number: ")) .. break .. except ValueError: .. print("Oops! That was no valid number. Try again...") ..._4 Misalnya, saat mengumpulkan pengecualian ke dalam grup pengecualian, kami mungkin ingin menambahkan informasi konteks untuk setiap kesalahan. Berikut ini setiap pengecualian dalam grup memiliki catatan yang menunjukkan kapan kesalahan ini terjadi Bagaimana Anda menangani kesalahan dalam percobaanBlok kecuali memungkinkan Anda menangani kesalahan . Blok else memungkinkan Anda mengeksekusi kode saat tidak ada kesalahan. Blok akhirnya memungkinkan Anda mengeksekusi kode, terlepas dari hasil blok coba-dan kecuali.
Apakah boleh menggunakan cobaPython tidak menganut gagasan bahwa pengecualian hanya boleh digunakan untuk kasus luar biasa, sebenarnya idiomnya adalah 'minta maaf, bukan izin'. Ini berarti bahwa menggunakan pengecualian sebagai bagian rutin dari kontrol aliran Anda sangat dapat diterima, dan sebenarnya, dianjurkan .
Bagaimana cara menangkap kesalahan basis data dengan Python?DatabaseError. Pengecualian ini muncul ketika ada masalah dalam pemrosesan data, kesalahan dalam sintaks sql, masalah internal mysql. Jika koneksi dibuat dan masalah muncul maka DatabaseError akan mengetahuinya . InterfaceError. Ketika koneksi database gagal karena beberapa alasan, MySQLdb akan memunculkan InterfaceError.
Bagaimana cara memperbaiki konektor mysql dengan Python?3 Jawaban . Instal mysql-connector-python (di lingkungan python Anda) Gunakan kode ini. Buka koneksi basis data. impor mysql. penyambung. mydb = mysql. penyambung. terhubung(Host="127. 0. 0. 1", port="3306", pengguna="root", kata sandi="root", auth_plugin="mysql_native_password") cetak(mydb) |