Python menangkap semua pengecualian sebagai variabel

Pengecualian adalah kesalahan yang terjadi selama eksekusi program. Pengecualian diketahui non-programmer sebagai contoh yang tidak sesuai dengan aturan umum. Nama "pengecualian" dalam ilmu komputer juga memiliki arti ini. Ini menyiratkan bahwa masalah (pengecualian) tidak sering terjadi, mis. e. pengecualiannya adalah "pengecualian terhadap aturan". Penanganan pengecualian adalah konstruksi dalam beberapa bahasa pemrograman untuk menangani atau menangani kesalahan secara otomatis. Banyak bahasa pemrograman seperti C++, Objective-C, PHP, Java, Ruby, Python, dan banyak lainnya memiliki dukungan bawaan untuk penanganan pengecualian

Penanganan kesalahan umumnya diselesaikan dengan menyimpan status eksekusi pada saat kesalahan terjadi dan mengganggu aliran normal program untuk mengeksekusi fungsi atau potongan kode khusus, yang dikenal sebagai penangan pengecualian. Bergantung pada jenis kesalahan ("pembagian dengan nol", "kesalahan membuka file" dan seterusnya) yang telah terjadi, penangan kesalahan dapat "memperbaiki" masalah dan program dapat dilanjutkan setelahnya dengan data yang disimpan sebelumnya.

Python menangkap semua pengecualian sebagai variabel

Pelatihan Python langsung

Python menangkap semua pengecualian sebagai variabel

Menikmati halaman ini?

Lihat. Ikhtisar kursus Python langsung

Daftar di sini

Penanganan Pengecualian dengan Python

Penanganan pengecualian di Python sangat mirip dengan Java. Kode, yang menyimpan risiko pengecualian, disematkan di blok percobaan. Sementara di Java pengecualian ditangkap oleh klausa catch, di Python kami memiliki pernyataan yang diperkenalkan oleh kata kunci "kecuali". Dimungkinkan untuk membuat pengecualian "dibuat khusus". Dengan pernyataan kenaikan, dimungkinkan untuk memaksa terjadinya pengecualian tertentu

Mari kita lihat contoh sederhana. Dengan asumsi kami ingin meminta pengguna untuk memasukkan bilangan bulat. Jika kita menggunakan input(), inputnya akan berupa string, yang harus kita masukkan ke dalam bilangan bulat. Jika input bukan bilangan bulat yang valid, kami akan menghasilkan (menaikkan) ValueError. Hal ini kami tunjukkan dalam sesi interaktif berikut ini

n = int(input("Please enter a number: "))

Dengan bantuan penanganan pengecualian, kita dapat menulis kode yang kuat untuk membaca bilangan bulat dari masukan

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")
_

Ini adalah sebuah loop, yang rusak hanya jika bilangan bulat yang valid telah diberikan. Loop sementara dimasukkan. Kode di dalam klausa try akan dieksekusi pernyataan demi pernyataan. Jika tidak ada pengecualian yang terjadi selama eksekusi, eksekusi akan mencapai pernyataan break dan perulangan while akan ditinggalkan. Jika terjadi pengecualian, i. e. dalam pengecoran n, sisa blok percobaan akan dilewati dan klausa kecuali akan dieksekusi. Kesalahan yang muncul, dalam kasus kami ValueError, harus cocok dengan salah satu nama setelahnya kecuali. Dalam contoh kita hanya satu, i. e. "Kesalahan Nilai. ". Setelah mencetak teks pernyataan cetak, eksekusi melakukan pengulangan lagi. Ini dimulai dengan input baru ()

Kita dapat mengubah kode di atas menjadi sebuah fungsi, yang dapat digunakan untuk mendapatkan masukan yang sangat mudah

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")

Kami menggunakan ini dengan contoh usia anjing kami dari bab Pernyataan Bersyarat

def dog2human_age(dog_age):
    human_age = -1
    if dog_age < 0:
        human_age = -1
    elif dog_age == 0:
        human_age = 0
    elif dog_age == 1:
        human_age = 14
    elif dog_age == 2:
        human_age = 22
    else:
        human_age = 22 + (dog_age -2) * 5
    return human_age

age = int_input("Age of your dog? ")
print("Age of the dog: ", dog2human_age(age))
_

KELUARAN

Not a proper integer! Try it again
Not a proper integer! Try it again
Age of the dog:  37

Beberapa Klausa Kecuali

Pernyataan try mungkin memiliki lebih dari satu kecuali klausa untuk pengecualian yang berbeda. Tapi paling banyak satu kecuali klausa akan dieksekusi

Contoh kami berikutnya menunjukkan klausa percobaan, di mana kami membuka file untuk dibaca, membaca baris dari file ini dan mengubah baris ini menjadi bilangan bulat. Setidaknya ada dua kemungkinan pengecualian

an IOError
ValueError
_

Untuk berjaga-jaga jika kami memiliki klausa tambahan yang tidak disebutkan namanya kecuali untuk kesalahan yang tidak terduga

import sys

try:
    f = open('integers.txt')
    s = f.readline()
    i = int(s.strip())
except IOError as e:
    errno, strerror = e.args
    print("I/O error({0}): {1}".format(errno,strerror))
    # e can be printed directly without using .args:
    # print(e)
except ValueError:
    print("No valid integer in line.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise

KELUARAN

I/O error(2): No such file or directory
_

Penanganan IOError pada contoh sebelumnya adalah perhatian khusus. Klausa kecuali untuk IOError menentukan variabel "e" setelah nama pengecualian (IOError). Variabel "e" terikat pada instance pengecualian dengan argumen yang disimpan dalam instance. argumen. Jika kami memanggil skrip di atas dengan file yang tidak ada, kami mendapatkan pesannya

Kesalahan I/O(2). tidak ada berkas atau direktori seperti itu

Dan jika file bilangan bulat. txt tidak terbaca, e. g. jika kami tidak memiliki izin untuk membacanya, kami mendapatkan pesan berikut

Kesalahan I/O(13). Izin ditolak

Sebuah klausa kecuali dapat menyebutkan lebih dari satu pengecualian dalam tupel nama kesalahan, seperti yang kita lihat dalam contoh berikut

try:
    f = open('integers.txt')
    s = f.readline()
    i = int(s.strip())
except (IOError, ValueError):
    print("An I/O error or a ValueError occurred")
except:
    print("An unexpected error occurred")
    raise
_

KELUARAN

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")
_0

Kami ingin mendemonstrasikan sekarang, apa yang terjadi, jika kami memanggil fungsi di dalam blok percobaan dan jika pengecualian terjadi di dalam pemanggilan fungsi

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")
_1

KELUARAN

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")
_2

fungsi menangkap pengecualian

Kami akan memperluas contoh kami sekarang sehingga fungsi tersebut akan menangkap pengecualian secara langsung

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")
_3

KELUARAN

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")
_4

Seperti yang kita duga, pengecualian ditangkap di dalam fungsi dan bukan di pengecualian penelepon

Kami sekarang menambahkan "kenaikan", yang menghasilkan ValueError lagi, sehingga pengecualian akan disebarkan ke pemanggil

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")
_5

KELUARAN

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")
_6

Pelatihan Python langsung

Python menangkap semua pengecualian sebagai variabel

Menikmati halaman ini?

Lihat. Ikhtisar kursus Python langsung

Kursus online yang akan datang

Dasar-Dasar Python untuk Pemula

Kursus Lanjutan Intensif

Python untuk Insinyur dan Ilmuwan

Pemrograman Berorientasi Objek dengan Python

Daftar di sini

Pengecualian yang dibuat khusus

Anda dapat membuat Pengecualian sendiri

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")
_7

KELUARAN

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")
_8

Cara terbaik atau Pythonic untuk melakukan ini, terdiri dari mendefinisikan kelas pengecualian yang mewarisi dari kelas Pengecualian. Anda harus melalui bab tentang Pemrograman Berorientasi Objek untuk memahami sepenuhnya contoh berikut

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")
_9

KELUARAN

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")
0

Tindakan Pembersihan (coba. akhirnya)

Selama ini pernyataan try selalu dipasangkan dengan exception clauses. Tapi ada cara lain untuk menggunakannya juga. Pernyataan try dapat diikuti oleh klausa finally. Klausa terakhir disebut klausul pembersihan atau penghentian, karena harus dijalankan dalam semua keadaan, i. e. klausa "akhirnya" selalu dijalankan terlepas dari apakah pengecualian terjadi di blok percobaan atau tidak. Contoh sederhana untuk menunjukkan klausa akhirnya

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")
1

KELUARAN

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")
2

Pelatihan Python langsung

Python menangkap semua pengecualian sebagai variabel

Menikmati halaman ini?

Lihat. Ikhtisar kursus Python langsung

Daftar di sini

Menggabungkan mencoba, kecuali dan akhirnya

"akhirnya" dan "kecuali" dapat digunakan bersama untuk blok percobaan yang sama, seperti yang dapat dilihat pada contoh Python berikut

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")
_3

KELUARAN

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")
_4

Klausa lain

Mencoba. kecuali pernyataan memiliki klausa lain opsional. Blok lain harus diposisikan setelah semua kecuali klausa. Klausa lain akan dieksekusi jika klausa try tidak memunculkan pengecualian

Contoh berikut membuka file dan membaca semua baris ke dalam daftar yang disebut "teks"

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")
5

KELUARAN

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")
6

Contoh ini menerima nama file melalui argumen baris perintah. Jadi pastikan Anda menyebutnya dengan benar. Anggaplah Anda menyimpan program ini sebagai "exception_test. py". Dalam hal ini, Anda harus memanggilnya dengan

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")
7

Jika Anda tidak menginginkan perilaku ini, ubah saja baris "file_name = sys. argv[1]" ke "file_name = 'bilangan bulat. txt'"

Contoh sebelumnya hampir sama dengan

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")
_8

KELUARAN

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")
6

Perbedaan utamanya adalah pada kasus pertama, semua pernyataan dari blok try dapat menyebabkan pesan kesalahan yang sama "tidak dapat dibuka. ", yang salah, jika fh. tutup() atau fh. readlines() menimbulkan kesalahan

Bagaimana cara mendapatkan semua pengecualian dengan Python?

Cara lain untuk menangkap semua pengecualian Python saat terjadi selama runtime adalah dengan menggunakan kata kunci raise . Ini adalah proses manual di mana Anda dapat secara opsional meneruskan nilai ke pengecualian untuk mengklarifikasi alasan mengapa itu dimunculkan. jika x

Bagaimana Anda menangkap banyak pengecualian dengan Python?

Dengan menangani beberapa pengecualian, sebuah program dapat merespons pengecualian yang berbeda tanpa menghentikannya. Dalam Python, blok coba-kecuali dapat digunakan untuk menangkap dan merespons satu atau beberapa pengecualian . Dalam kasus di mana suatu proses memunculkan lebih dari satu kemungkinan pengecualian, semuanya dapat ditangani menggunakan satu klausa kecuali.

Apakah try catch menangkap semua pengecualian?

Kita dapat menggunakan blok try catch untuk melindungi kode. Catch block digunakan untuk menangkap semua jenis exception . Kata kunci "catch" digunakan untuk menangkap pengecualian.

Bagaimana Anda mencatat semua kesalahan dengan Python?

Untuk mencatat pengecualian di Python, kita dapat menggunakan modul pencatatan dan melalui itu kita dapat mencatat kesalahan . Mencatat pengecualian dalam python dengan kesalahan dapat dilakukan di logging. pengecualian() metode. Fungsi ini mencatat pesan dengan level ERROR pada logger ini.