Oleh Eric Carb
Alur Kontrol Pengecualian - Coba, Kecuali, Lain, Terakhir
Pengecualian dalam Python adalah objek yang mewakili kesalahan. Pengecualian dapat dimunculkan dengan banyak cara, seperti meneruskan argumen yang tidak valid ke fungsi ("Boo" + 7), melakukan operasi ilegal tertentu (12/0) atau bahkan secara eksplisit (menaikkan TypeError). Secara default, pengecualian menghentikan program Python dan mencetak Traceback ke konsol dengan informasi tentang pengecualian dan cara memunculkannya. Namun, pernyataan try ada untuk memberikan aliran kontrol ke pengecualian sehingga Anda dapat mencegah program Anda mogok dan bahkan menggunakan objek pengecualian untuk keuntungan Anda. Ini biasanya disebut sebagai "menangkap" pengecualian. Pernyataan try terlihat seperti ini
mencoba
Kode dengan pengecualian yang ingin Anda tangkap. Jika pengecualian dimunculkan, aliran kontrol segera meninggalkan blok ini dan menuju ke blok kecuali
kecuali [(Pengecualian[, Pengecualian])] [sebagai VAR]
Kode ini dijalankan hanya jika pengecualian dimunculkan di blok try. Kode yang dieksekusi di blok ini sama seperti kode biasa. jika ada pengecualian, itu tidak akan ditangkap secara otomatis (dan mungkin menghentikan program)
Secara opsional, Anda dapat menyebutkan jenis pengecualian tertentu dalam pernyataan exception, dalam hal ini blok hanya akan dieksekusi jika salah satu dari pengecualian yang disebutkan adalah yang dimunculkan dalam try. Saat memberi nama beberapa pengecualian, gunakan tuple. Adalah legal untuk memiliki banyak pernyataan exception, yang masing-masing menyebutkan jenis pengecualian yang berbeda. Jika tidak ada pengecualian yang disebutkan dalam pernyataan kecuali, itu akan menangkap semua pengecualian;
Menyertakan ekspresi as dengan pernyataan exception memungkinkan Anda untuk menyimpan objek pengecualian yang muncul di blok try dalam sebuah variabel dan menggunakannya di dalam blok ini. Untuk menyimpan pengecualian dalam variabel ketika tidak ada yang diberi nama, beri nama "Pengecualian" sebagai gantinya (mis. e. kecuali Pengecualian sebagai e). Hanya satu variabel yang dapat dicantumkan setelah as
Blok ini diperlukan (walaupun semua sudah lulus)
[kalau tidak. ]
Kode ini dijalankan hanya jika tidak ada pengecualian yang dimunculkan di blok try. Kode yang dieksekusi di blok ini sama seperti kode biasa. jika ada pengecualian, itu tidak akan ditangkap secara otomatis (dan mungkin menghentikan program). Perhatikan bahwa jika blok else dijalankan, maka blok exception tidak dijalankan, dan sebaliknya. Blok ini opsional
[akhirnya. ]
Kode ini selalu dijalankan setelah blok lain, bahkan jika ada pengecualian yang tidak tertangkap (yang jelas tidak menyebabkan crash) atau pernyataan pengembalian di salah satu blok lainnya. Kode yang dieksekusi di blok ini sama seperti kode biasa. jika ada pengecualian, itu tidak akan ditangkap secara otomatis (dan mungkin menghentikan program). Blok ini juga opsional
try & finally blok tidak semudah yang dibayangkan, terutama ketika mereka mengembalikan nilai dari suatu fungsi. Untuk informasi menarik lainnya, ikuti saya melalui Twitter. Kesimpulan dari postingan ini adalahJawaban yang tepat akan bergantung pada tujuan logika aplikasi Anda. Anda ingin memastikan kode Python Anda tidak gagal secara diam-diam, menyelamatkan Anda dan rekan tim Anda dari keharusan memburu kesalahan yang mengakar kuat
Inilah perbedaan antara if "raisins" in text_field: raise ValueError("That word is not allowed here") _0 dan if "raisins" in text_field: raise ValueError("That word is not allowed here") 1 saat menangani kegagalan di Python
Pernyataan if "raisins" in text_field: raise ValueError("That word is not allowed here") 0 memungkinkan programmer untuk memaksa terjadinya pengecualian tertentu. ()
Gunakan if "raisins" in text_field: raise ValueError("That word is not allowed here") 0 ketika Anda tahu Anda menginginkan perilaku tertentu, seperti
raise TypeError("Wanted strawberry, got grape.") _
Menaikkan pengecualian menghentikan aliran program Anda, memungkinkan pengecualian untuk meluapkan tumpukan panggilan. Dalam contoh di atas, ini memungkinkan Anda menangani if "raisins" in text_field: raise ValueError("That word is not allowed here") 4 secara eksplisit nanti. Jika if "raisins" in text_field: raise ValueError("That word is not allowed here") 4 tidak tertangani, eksekusi kode berhenti dan Anda akan mendapatkan pesan pengecualian yang tidak tertangani
Naikkan berguna dalam kasus di mana Anda ingin menentukan perilaku tertentu terjadi. Misalnya, Anda dapat memilih untuk melarang kata-kata tertentu di bidang teks
if "raisins" in text_field: raise ValueError("That word is not allowed here")
Raise mengambil contoh pengecualian, atau turunan dari. Ini semua
Naikkan dapat membantu Anda menghindari fungsi penulisan yang gagal secara diam-diam. Misalnya, kode ini tidak akan memunculkan pengecualian jika if "raisins" in text_field: raise ValueError("That word is not allowed here") 6 tidak ada
import os def sandwich_or_bust(bread: str) -> str: jam = os.getenv("JAM") return bread + str(jam) + bread s = sandwich_or_bust("\U0001F35E") print(s) # Prints "🍞None🍞" which is not very tasty. _
Untuk menyebabkan fungsi if "raisins" in text_field: raise ValueError("That word is not allowed here") _7 benar-benar rusak, tambahkan if "raisins" in text_field: raise ValueError("That word is not allowed here") 0
import os def sandwich_or_bust(bread: str) -> str: jam = os.getenv("JAM") if not jam: raise ValueError("There is no jam. Sad bread.") return bread + str(jam) + bread s = sandwich_or_bust("\U0001F35E") print(s) # ValueError: There is no jam. Sad bread.
Setiap kali kode Anda berinteraksi dengan variabel eksternal, modul, atau layanan, ada kemungkinan kegagalan. Anda dapat menggunakan if "raisins" in text_field: raise ValueError("That word is not allowed here") 0 dalam pernyataan import os def sandwich_or_bust(bread: str) -> str: jam = os.getenv("JAM") return bread + str(jam) + bread s = sandwich_or_bust("\U0001F35E") print(s) # Prints "🍞None🍞" which is not very tasty. 0 untuk membantu memastikan kegagalan tersebut tidak diam
Untuk menangani kemungkinan kegagalan dengan mengambil tindakan jika ada, gunakan pernyataan try … except
try: s = sandwich_or_bust("\U0001F35E") print(s) except ValueError: buy_more_jam() raise
Ini memungkinkan Anda import os def sandwich_or_bust(bread: str) -> str: jam = os.getenv("JAM") return bread + str(jam) + bread s = sandwich_or_bust("\U0001F35E") print(s) # Prints "🍞None🍞" which is not very tasty. _5 sebelum memunculkan kembali pengecualian. Jika Anda ingin menyebarkan pengecualian yang tertangkap, gunakan if "raisins" in text_field: raise ValueError("That word is not allowed here") 0 tanpa argumen untuk menghindari kemungkinan hilangnya jejak tumpukan
Jika Anda tidak tahu bahwa pengecualiannya adalah import os def sandwich_or_bust(bread: str) -> str: jam = os.getenv("JAM") return bread + str(jam) + bread s = sandwich_or_bust("\U0001F35E") print(s) # Prints "🍞None🍞" which is not very tasty. 7, Anda juga dapat menggunakan import os def sandwich_or_bust(bread: str) -> str: jam = os.getenv("JAM") return bread + str(jam) + bread s = sandwich_or_bust("\U0001F35E") print(s) # Prints "🍞None🍞" which is not very tasty. 8 atau menangkap turunan apa pun dari kelas import os def sandwich_or_bust(bread: str) -> str: jam = os.getenv("JAM") return bread + str(jam) + bread s = sandwich_or_bust("\U0001F35E") print(s) # Prints "🍞None🍞" which is not very tasty. 9 dengan import os def sandwich_or_bust(bread: str) -> str: jam = os.getenv("JAM") if not jam: raise ValueError("There is no jam. Sad bread.") return bread + str(jam) + bread s = sandwich_or_bust("\U0001F35E") print(s) # ValueError: There is no jam. Sad bread. 0. Jika memungkinkan, lebih baik menaikkan dan menangani pengecualian secara eksplisit
Gunakan import os def sandwich_or_bust(bread: str) -> str: jam = os.getenv("JAM") if not jam: raise ValueError("There is no jam. Sad bread.") return bread + str(jam) + bread s = sandwich_or_bust("\U0001F35E") print(s) # ValueError: There is no jam. Sad bread. _1 untuk mengeksekusi kode jika try tidak memunculkan pengecualian. Sebagai contoh
try: s = sandwich_or_bust("\U0001F35E") print(s) except ValueError: buy_more_jam() raise else: print("Congratulations on your sandwich.")
Anda juga dapat menempatkan garis cetak di dalam blok try, namun, ini kurang eksplisit
Saat Anda menggunakan if "raisins" in text_field: raise ValueError("That word is not allowed here") 1 dengan Python, Anda mengembalikan nilai. Suatu fungsi kembali ke lokasi asal pemanggilannya
Meskipun lebih idiomatis untuk if "raisins" in text_field: raise ValueError("That word is not allowed here") 0 kesalahan dalam Python, mungkin ada saat-saat di mana Anda menemukan if "raisins" in text_field: raise ValueError("That word is not allowed here") 1 lebih dapat diterapkan
Misalnya, jika kode Python Anda berinteraksi dengan komponen lain yang tidak menangani kelas pengecualian, Anda mungkin ingin mengembalikan pesan sebagai gantinya. Berikut adalah contoh menggunakan pernyataan ________36______ … except
from typing import Union def share_sandwich(sandwich: int) -> Union[float, Exception]: try: bad_math = sandwich / 0 return bad_math except Exception as e: return e s = share_sandwich(1) print(s) # Prints "division by zero"
Perhatikan bahwa saat Anda mengembalikan objek kelas import os def sandwich_or_bust(bread: str) -> str: jam = os.getenv("JAM") return bread + str(jam) + bread s = sandwich_or_bust("\U0001F35E") print(s) # Prints "🍞None🍞" which is not very tasty. _9, Anda akan mendapatkan representasi dari nilai terkaitnya, biasanya item pertama dalam daftar argumennya. Pada contoh di atas, ini adalah penjelasan string dari exception. Dalam beberapa kasus, itu mungkin tuple dengan informasi lain tentang pengecualian
Anda juga dapat menggunakan if "raisins" in text_field: raise ValueError("That word is not allowed here") _1 untuk memberikan objek kesalahan tertentu, seperti dengan. Misalnya, Anda mungkin ingin mengembalikan try: s = sandwich_or_bust("\U0001F35E") print(s) except ValueError: buy_more_jam() raise 2 alih-alih try: s = sandwich_or_bust("\U0001F35E") print(s) except ValueError: buy_more_jam() raise 3 untuk alasan keamanan
if object.owner != request.user: return HttpResponseNotFound
Menggunakan if "raisins" in text_field: raise ValueError("That word is not allowed here") _1 dapat membantu Anda menulis kode berisik yang tepat saat fungsi Anda diharapkan mengembalikan nilai tertentu, dan saat berinteraksi dengan elemen luar
Kegagalan diam-diam menciptakan beberapa bug yang paling membuat frustrasi untuk ditemukan dan diperbaiki. Anda dapat membantu menciptakan pengalaman pengembangan yang menyenangkan untuk diri sendiri dan tim Anda dengan menggunakan if "raisins" in text_field: raise ValueError("That word is not allowed here") 0 dan if "raisins" in text_field: raise ValueError("That word is not allowed here") 1 untuk memastikan bahwa kesalahan ditangani dalam kode Python Anda
Saya menulis tentang praktik pengembangan yang baik dan cara meningkatkan produktivitas sebagai pengembang perangkat lunak. Anda bisa mendapatkan tips ini langsung di kotak masuk Anda dengan mendaftar di bawah ini