Cara memeriksa pengecualian dengan python

Program membuang kesalahan ketika misalnya input yang salah diberikan. Karena itu, seseorang perlu memastikan bahwa kesalahan terjadi ketika input yang salah sebenarnya diberikan. Karena itu kita perlu memeriksa pengecualian yang tepat, untuk contoh ini kita akan menggunakan pengecualian berikut

class WrongInputException(Exception):
    pass

Pengecualian ini dimunculkan ketika input yang salah diberikan, dalam konteks berikut di mana kami selalu mengharapkan angka sebagai input teks

def convert2number(random_input):
    try:
        my_input = int(random_input)
    except ValueError:
        raise WrongInputException("Expected an integer!")
    return my_input
_

Untuk memeriksa apakah pengecualian telah diajukan, kami menggunakan assertRaises untuk memeriksa pengecualian itu. assertRaises dapat digunakan dalam dua cara

  1. Menggunakan panggilan fungsi reguler. Argumen pertama mengambil tipe pengecualian, yang kedua adalah callable (biasanya fungsi) dan argumen lainnya diteruskan ke callable ini
  2. Menggunakan klausa with, hanya memberikan tipe pengecualian ke fungsi. Keuntungannya adalah lebih banyak kode yang dapat dieksekusi, tetapi harus digunakan dengan hati-hati karena banyak fungsi dapat menggunakan pengecualian yang sama yang dapat menimbulkan masalah. Sebuah contoh. dengan diri sendiri. assertRaises(WrongInputException). convert2number("bukan angka")

Ini pertama telah diimplementasikan dalam kasus uji berikut

import unittest

class ExceptionTestCase(unittest.TestCase):

    def test_wrong_input_string(self):
        self.assertRaises(WrongInputException, convert2number, "not a number")

    def test_correct_input(self):
        try:
            result = convert2number("56")
            self.assertIsInstance(result, int)
        except WrongInputException:
            self.fail()

Mungkin juga ada kebutuhan untuk memeriksa pengecualian yang seharusnya tidak dibuang. Namun, pengujian akan gagal secara otomatis saat pengecualian dilemparkan dan karenanya mungkin tidak diperlukan sama sekali. Hanya untuk menunjukkan opsi, metode pengujian kedua menunjukkan kasus tentang bagaimana seseorang dapat memeriksa pengecualian agar tidak dibuang. Pada dasarnya, ini menangkap pengecualian dan kemudian gagal dalam pengujian menggunakan metode fail

Ringkasan. dalam tutorial ini, Anda mempelajari cara menangani pengecualian di Python dengan cara yang benar menggunakan pernyataan

try: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)

Code language: Python (python)
5

Pengantar penanganan pengecualian di Python

Untuk menangani pengecualian, Anda menggunakan pernyataan

try: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)

Code language: Python (python)
5. Pernyataan

try: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)

Code language: Python (python)
_5 memiliki klausa berikut

try: # code that you want to protect from exceptions except <ExceptionType> as ex: # code that handle the exception finally: # code that always execute whether the exception occurred or not else: # code that excutes if try execute normally (an except clause must be present)

Code language: Python (python)
_

Mari kita periksa pernyataan

try: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)

Code language: Python (python)
5 secara lebih rinci

mencoba

Dalam klausa

try: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)

Code language: Python (python)
_5, Anda menempatkan kode yang melindungi dari satu atau lebih pengecualian potensial. Merupakan praktik yang baik untuk menjaga kode sesingkat mungkin. Seringkali, Anda akan memiliki satu pernyataan dalam klausa

try: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)

Code language: Python (python)
5

Klausa

try: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)

Code language: Python (python)
_5 muncul tepat satu kali dalam pernyataan

try: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)

Code language: Python (python)
5

kecuali

Dalam klausa

def divide(a, b): return a / b

Code language: Python (python)
_3, Anda menempatkan kode yang menangani jenis pengecualian tertentu. Pernyataan

try: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)

Code language: Python (python)
5 dapat memiliki nol atau lebih klausa

def divide(a, b): return a / b

Code language: Python (python)
3. Biasanya, setiap klausa

def divide(a, b): return a / b

Code language: Python (python)
_3 menangani jenis pengecualian yang berbeda dengan cara tertentu

Dalam klausul

def divide(a, b): return a / b

Code language: Python (python)
_3,

def divide(a, b): return a / b

Code language: Python (python)
8 bersifat opsional. Dan

def divide(a, b): return a / b

Code language: Python (python)
_9 juga opsional. Namun, jika Anda menghilangkan

divide(10, 0)

Code language: Python (python)
_0, Anda akan memiliki penangan pengecualian kosong

Saat menentukan jenis pengecualian dalam klausa

def divide(a, b): return a / b

Code language: Python (python)
3, Anda menempatkan pengecualian paling spesifik hingga paling tidak spesifik dari atas ke bawah

Jika Anda memiliki logika yang sama yang menangani berbagai jenis pengecualian, Anda dapat mengelompokkannya dalam satu klausa

def divide(a, b): return a / b

Code language: Python (python)
3. Sebagai contoh

try: ... except <ExceptionType1> as ex: log(ex) except <ExceptionType2> as ex: log(ex)

Code language: Python (python)

Menjadi

try: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)

Code language: Python (python)

Penting untuk diperhatikan bahwa urutan

def divide(a, b): return a / b

Code language: Python (python)
_3 penting karena Python akan menjalankan klausa

def divide(a, b): return a / b

Code language: Python (python)
3 pertama yang jenis pengecualiannya cocok dengan pengecualian yang terjadi

akhirnya

Klausa

divide(10, 0)

Code language: Python (python)
_5 dapat muncul nol atau 1 kali dalam pernyataan

try: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)

Code language: Python (python)
5. Klausa

divide(10, 0)

Code language: Python (python)
_5 selalu dijalankan baik pengecualian terjadi atau tidak

kalau tidak

Klausa

divide(10, 0)

Code language: Python (python)
_8 juga muncul nol atau 1 kali. Dan klausa

divide(10, 0)

Code language: Python (python)
_8 hanya valid jika pernyataan try memiliki setidaknya satu klausa

def divide(a, b): return a / b

Code language: Python (python)
3

Biasanya, Anda menempatkan kode yang dijalankan jika klausa

try: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)

Code language: Python (python)
5 berakhir secara normal

Contoh penanganan pengecualian python

Berikut ini mendefinisikan fungsi yang mengembalikan hasil angka dengan yang lain

def divide(a, b): return a / b

Code language: Python (python)

Jika Anda meneruskan 0 ke argumen kedua, Anda akan mendapatkan pengecualian

ZeroDivisionError: division by zero

Code language: Python (python)
2

divide(10, 0)

Code language: Python (python)

Kesalahan

ZeroDivisionError: division by zero

Code language: Python (python)

Untuk memperbaikinya, Anda dapat menangani pengecualian

ZeroDivisionError: division by zero

Code language: Python (python)
2 di fungsi

ZeroDivisionError: division by zero

Code language: Python (python)
4 sebagai berikut

def divide(a, b): try: return a / b except ZeroDivisionError as ex: return None

Code language: Python (python)

Dalam contoh ini, fungsi

ZeroDivisionError: division by zero

Code language: Python (python)
_4 mengembalikan

ZeroDivisionError: division by zero

Code language: Python (python)
6 jika

ZeroDivisionError: division by zero

Code language: Python (python)
2 terjadi

def divide(a, b): try: return a / b except ZeroDivisionError as ex: return None

Code language: Python (python)

Saat menggunakan fungsi

ZeroDivisionError: division by zero

Code language: Python (python)
4, Anda perlu memeriksa apakah hasilnya adalah

ZeroDivisionError: division by zero

Code language: Python (python)
6

result = divide(10, 0) if result is not None: print('result:', result) else: print('Invalid inputs')

Code language: Python (python)

Tetapi mengembalikan

ZeroDivisionError: division by zero

Code language: Python (python)
_6 mungkin bukan yang terbaik karena orang lain mungkin secara tidak sengaja mengevaluasi hasil dalam pernyataan

def divide(a, b): try: return a / b except ZeroDivisionError as ex: return None

Code language: Python (python)
1 seperti ini

result = divide(10, 0) if result: print('result:', result) else: print('Invalid inputs')

Code language: Python (python)

Dalam hal ini, itu berhasil. Namun, itu tidak akan berhasil jika argumen pertama adalah nol. Sebagai contoh

try: ... except <ExceptionType1> as ex: log(ex) except <ExceptionType2> as ex: log(ex)

Code language: Python (python)
_0

Pendekatan yang lebih baik adalah mengajukan pengecualian kepada penelepon jika pengecualian

ZeroDivisionError: division by zero

Code language: Python (python)
2 terjadi. Sebagai contoh

try: ... except <ExceptionType1> as ex: log(ex) except <ExceptionType2> as ex: log(ex)

Code language: Python (python)
_1

Dalam contoh ini, fungsi

ZeroDivisionError: division by zero

Code language: Python (python)
_4 akan menimbulkan kesalahan jika

def divide(a, b): try: return a / b except ZeroDivisionError as ex: return None

Code language: Python (python)
4 adalah nol. Untuk menggunakan fungsi

ZeroDivisionError: division by zero

Code language: Python (python)
4, Anda perlu menangkap pengecualian

def divide(a, b): try: return a / b except ZeroDivisionError as ex: return None

Code language: Python (python)
6

try: ... except <ExceptionType1> as ex: log(ex) except <ExceptionType2> as ex: log(ex)

Code language: Python (python)
_2

Keluaran

try: ... except <ExceptionType1> as ex: log(ex) except <ExceptionType2> as ex: log(ex)

Code language: Python (python)
_3

Merupakan praktik yang baik untuk mengajukan pengecualian alih-alih mengembalikan

ZeroDivisionError: division by zero

Code language: Python (python)
6 dalam kasus khusus

Kecuali contoh pesanan

Saat Anda menangkap pengecualian dalam klausa kecuali, Anda perlu menempatkan pengecualian dari yang paling spesifik hingga yang paling tidak spesifik dalam hal hierarki pengecualian

Berikut ini menunjukkan tiga kelas pengecualian.

def divide(a, b): try: return a / b except ZeroDivisionError as ex: return None

Code language: Python (python)
8,

def divide(a, b): try: return a / b except ZeroDivisionError as ex: return None

Code language: Python (python)
9, dan

def divide(a, b): try: return a / b except ZeroDivisionError as ex: return None

Code language: Python (python)
0

Jika Anda menangkap pengecualian, Anda harus menempatkannya dalam urutan berikut. IndexError, LookupError, dan Pengecualian

Sebagai contoh, berikut ini mendefinisikan daftar tiga string dan upaya untuk mengakses elemen ke-4

try: ... except <ExceptionType1> as ex: log(ex) except <ExceptionType2> as ex: log(ex)

Code language: Python (python)
_4

Ini mengeluarkan kesalahan berikut

try: ... except <ExceptionType1> as ex: log(ex) except <ExceptionType2> as ex: log(ex)

Code language: Python (python)
_5

Akses

def divide(a, b): try: return a / b except ZeroDivisionError as ex: return None

Code language: Python (python)
_1 menyebabkan pengecualian

def divide(a, b): try: return a / b except ZeroDivisionError as ex: return None

Code language: Python (python)
0. Namun, jika Anda menukar klausa

def divide(a, b): return a / b

Code language: Python (python)
_3 dan menangkap

def divide(a, b): try: return a / b except ZeroDivisionError as ex: return None

Code language: Python (python)
9 pertama dan

def divide(a, b): try: return a / b except ZeroDivisionError as ex: return None

Code language: Python (python)
0 kedua seperti ini

try: ... except <ExceptionType1> as ex: log(ex) except <ExceptionType2> as ex: log(ex)

Code language: Python (python)
_6

Keluaran

try: ... except <ExceptionType1> as ex: log(ex) except <ExceptionType2> as ex: log(ex)

Code language: Python (python)
_7

Pengecualian masih

def divide(a, b): try: return a / b except ZeroDivisionError as ex: return None

Code language: Python (python)
_0 tetapi pesan berikut ini menyesatkan

Penangan pengecualian kosong

Saat Anda ingin menangkap pengecualian apa pun, Anda dapat menggunakan penangan pengecualian telanjang. Penangan pengecualian kosong tidak menentukan jenis pengecualian

try: ... except <ExceptionType1> as ex: log(ex) except <ExceptionType2> as ex: log(ex)

Code language: Python (python)
_8

Ini setara dengan yang berikut ini

try: ... except <ExceptionType1> as ex: log(ex) except <ExceptionType2> as ex: log(ex)

Code language: Python (python)
_9

Penangan pengecualian telanjang akan menangkap pengecualian apa pun termasuk pengecualian SystemExit dan KeyboardInterupt

Pengecualian telanjang akan mempersulit untuk menghentikan program dengan Control-C dan menyamarkan program lain

Jika Anda ingin menangkap semua pengecualian yang menandakan kesalahan program, Anda dapat menggunakan exception sebagai gantinya

try: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)

Code language: Python (python)
0

Dalam praktiknya, Anda harus menghindari penggunaan penangan pengecualian kosong. Jika Anda tidak tahu pengecualian yang harus ditangkap, biarkan saja pengecualian terjadi dan kemudian ubah kode untuk menangani pengecualian ini

Untuk mendapatkan informasi pengecualian dari penangan pengecualian telanjang, Anda menggunakan fungsi

def divide(a, b): try: return a / b except ZeroDivisionError as ex: return None

Code language: Python (python)
7 dari modul

def divide(a, b): try: return a / b except ZeroDivisionError as ex: return None

Code language: Python (python)
8

Fungsi

def divide(a, b): try: return a / b except ZeroDivisionError as ex: return None

Code language: Python (python)
_9 mengembalikan tuple yang terdiri dari tiga nilai

  • result = divide(10, 0) if result is not None: print('result:', result) else: print('Invalid inputs')

    Code language: Python (python)
    0 adalah jenis pengecualian yang terjadi. Ini adalah subkelas dari

    result = divide(10, 0) if result is not None: print('result:', result) else: print('Invalid inputs')

    Code language: Python (python)
    1
  • result = divide(10, 0) if result is not None: print('result:', result) else: print('Invalid inputs')

    Code language: Python (python)
    _2 adalah turunan dari tipe pengecualian
  • result = divide(10, 0) if result is not None: print('result:', result) else: print('Invalid inputs')

    Code language: Python (python)
    _3 adalah objek yang merangkum tumpukan panggilan pada titik di mana pengecualian awalnya terjadi

Contoh berikut menggunakan fungsi

def divide(a, b): try: return a / b except ZeroDivisionError as ex: return None

Code language: Python (python)
_9 untuk memeriksa pengecualian ketika string dibagi dengan angka

try: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)

Code language: Python (python)
1

Keluaran

try: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)

Code language: Python (python)
2

Keluaran menunjukkan bahwa kode dalam klausa try menyebabkan pengecualian

result = divide(10, 0) if result is not None: print('result:', result) else: print('Invalid inputs')

Code language: Python (python)
5. Oleh karena itu, Anda dapat memodifikasi kode untuk menanganinya secara khusus sebagai berikut