Bisakah kita kembali dari kecuali dengan python?

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 adalah

Jawaban 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 tryexcept

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

Bisakah kita kembali kecuali dengan Python?

Perilaku pengembalian dengan coba/kecuali dengan Python . Python mendefinisikan coba/kecuali untuk menangani pengecualian dan melanjutkan eksekusi program lebih lanjut tanpa gangguan. User code can raise built-in exceptions. Python defines try/except to handle exceptions and proceed with the further execution of program without interruption.

Bagaimana cara mengembalikan pesan pengecualian dengan Python?

Untuk menangkap dan mencetak pengecualian yang terjadi dalam cuplikan kode, bungkus kode tersebut dalam blok try berindentasi, diikuti dengan perintah "kecuali Pengecualian sebagai e" yang menangkap pengecualian dan . Anda sekarang dapat mencetak pesan kesalahan dengan "print(e)" atau menggunakannya untuk diproses lebih lanjut. . You can now print the error message with "print(e)" or use it for further processing.

Apakah boleh menggunakan coba

Python 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 .

Apa yang terjadi setelah Kecuali Python?

pernyataan exception menjalankan kode di bawah pernyataan “try”. Jika kode ini tidak berhasil dijalankan, program akan berhenti di baris yang menyebabkan kesalahan dan kode "kecuali" akan berjalan . Blok coba memungkinkan Anda untuk menguji blok kode untuk kesalahan.