Kata kunci kenaikan digunakan untuk membuat pengecualian secara terprogram dalam Program Python. Mekanisme penanganan pengecualian Python disediakan melalui kata kunci. coba, kecuali, akhirnya dan naikkan.
Kedua bentuk kenaikan gaji yang diberikan di sini melakukan hal yang sama - keduanya menimbulkan pengecualian
menaikkan
atau
menaikkan
Kode apa pun yang berpotensi menghasilkan pengecualian dapat dibungkus di dalam blok try dan sekumpulan blok kecuali yang salah satunya menangani pengecualian.
Setelah pengecualian dibuat, Python akan mencari pencocokan kecuali penangan. Jika tidak ditemukan dalam lingkup saat ini, pencarian dilanjutkan dalam lingkup terlampir sampai penangan pengecualian ditemukan. Pengecualian ditangani oleh penangan pengecualian yang ditemukan. Jika penangan pengecualian tidak ditemukan, program akan mencetak traceback dan keluar.
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
8. 1. Kesalahan Sintaks
Kesalahan 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. Pengecualian
Bahkan 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 stack;
mencantumkan pengecualian bawaan dan artinya
8. 3. Menangani Pengecualian
Dimungkinkan 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
Pertama, klausa try (pernyataan antara dan kata kunci) dijalankan
Jika tidak ada pengecualian yang terjadi, kecuali klausa dilewati dan eksekusi pernyataan selesai
Jika pengecualian terjadi selama eksekusi klausa, klausa lainnya akan dilewati. Kemudian, jika tipenya cocok dengan pengecualian yang dinamai menurut kata kunci, klausa kecuali dieksekusi, dan kemudian eksekusi dilanjutkan setelah blok coba/kecuali
Jika pengecualian terjadi yang tidak cocok dengan pengecualian yang disebutkan dalam klausa kecuali, itu diteruskan ke pernyataan luar;
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): ... pass 2 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): ... pass 2 … ... except (RuntimeError, TypeError, NameError): ... pass 4
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 Pengecualian
Pernyataan 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 str 0
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 str 1
8. 5. Rantai Pengecualian
Jika 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 str 2
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)=}") raise 9
>>> 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 5
Untuk informasi lebih lanjut tentang mekanisme rantai, lihat
8. 6. Pengecualian Buatan Pengguna
Program 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 Pembersihan
Pernyataan 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 str 6
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): ... pass 2 menghasilkan pengecualian atau tidak. Poin-poin berikut membahas kasus yang lebih kompleks ketika pengecualian terjadi
Jika pengecualian terjadi selama eksekusi klausa ... except (RuntimeError, TypeError, NameError): ... pass 2, pengecualian dapat ditangani oleh klausa. Jika pengecualian tidak ditangani oleh klausa ... except (RuntimeError, TypeError, NameError): ... pass _4, pengecualian akan 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 dieksekusi
Pengecualian dapat terjadi selama eksekusi klausa ... except (RuntimeError, TypeError, NameError): ... pass _4 atau >>> 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. Sekali lagi, pengecualian 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
Jika 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 mengeksekusi , atau pernyataan, pengecualian tidak dimunculkan kembali
Jika pernyataan ... except (RuntimeError, TypeError, NameError): ... pass _2 mencapai , atau pernyataan, 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 tepat sebelum eksekusi pernyataan >>> 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 5, >>> 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 6 atau >>> 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 7
Jika 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 mencakup pernyataan >>> 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 7, nilai yang dikembalikan akan menjadi nilai dari pernyataan 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 klausa >>> 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 7, bukan nilai dari pernyataan >>> 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 7 klausa ... except (RuntimeError, TypeError, NameError): ... pass 2
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 7
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 Standar
Beberapa 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 Terkait
Ada 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): ... pass 4, 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 str 09 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 Catatan
Saat 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 str 12 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