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): passPengecualian 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
- Menggunakan panggilan fungsi reguler. Argumen pertama mengambil tipe pengecualian, yang kedua adalah callable (biasanya fungsi) dan argumen lainnya diteruskan ke callable ini
- 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)5Pengantar penanganan pengecualian di Python
Untuk menangani pengecualian, Anda menggunakan pernyataan
try: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)
Code language: Python (python)5. Pernyataantry: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)
Code language: Python (python)_5 memiliki klausa berikuttry: # 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 rincimencoba
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 klausatry: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)
Code language: Python (python)5Klausa
try: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)
Code language: Python (python)_5 muncul tepat satu kali dalam pernyataantry: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)
Code language: Python (python)5kecuali
Dalam klausa
def divide(a, b): return a / b
Code language: Python (python)_3, Anda menempatkan kode yang menangani jenis pengecualian tertentu. Pernyataantry: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)
Code language: Python (python)5 dapat memiliki nol atau lebih klausadef divide(a, b): return a / b
Code language: Python (python)3. Biasanya, setiap klausadef divide(a, b): return a / b
Code language: Python (python)_3 menangani jenis pengecualian yang berbeda dengan cara tertentuDalam 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. Dandef divide(a, b): return a / b
Code language: Python (python)_9 juga opsional. Namun, jika Anda menghilangkandivide(10, 0)
Code language: Python (python)_0, Anda akan memiliki penangan pengecualian kosongSaat 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 bawahJika 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 contohtry: ... except <ExceptionType1> as ex: log(ex) except <ExceptionType2> as ex: log(ex)
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 klausadef divide(a, b): return a / b
Code language: Python (python)3 pertama yang jenis pengecualiannya cocok dengan pengecualian yang terjadiakhirnya
Klausa
divide(10, 0)
Code language: Python (python)_5 dapat muncul nol atau 1 kali dalam pernyataantry: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)
Code language: Python (python)5. Klausadivide(10, 0)
Code language: Python (python)_5 selalu dijalankan baik pengecualian terjadi atau tidakkalau tidak
Klausa
divide(10, 0)
Code language: Python (python)_8 juga muncul nol atau 1 kali. Dan klausadivide(10, 0)
Code language: Python (python)_8 hanya valid jika pernyataan try memiliki setidaknya satu klausadef divide(a, b): return a / b
Code language: Python (python)3Biasanya, Anda menempatkan kode yang dijalankan jika klausa
try: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)
Code language: Python (python)5 berakhir secara normalContoh 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)2divide(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 fungsiZeroDivisionError: division by zero
Code language: Python (python)4 sebagai berikutdef 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 mengembalikanZeroDivisionError: division by zero
Code language: Python (python)6 jikaZeroDivisionError: division by zero
Code language: Python (python)2 terjadidef 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 adalahZeroDivisionError: division by zero
Code language: Python (python)6result = 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 pernyataandef divide(a, b): try: return a / b except ZeroDivisionError as ex: return None
Code language: Python (python)1 seperti iniresult = 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)_0Pendekatan yang lebih baik adalah mengajukan pengecualian kepada penelepon jika pengecualian
ZeroDivisionError: division by zero
Code language: Python (python)2 terjadi. Sebagai contohtry: ... except <ExceptionType1> as ex: log(ex) except <ExceptionType2> as ex: log(ex)
Code language: Python (python)_1Dalam contoh ini, fungsi
ZeroDivisionError: division by zero
Code language: Python (python)_4 akan menimbulkan kesalahan jikadef divide(a, b): try: return a / b except ZeroDivisionError as ex: return None
Code language: Python (python)4 adalah nol. Untuk menggunakan fungsiZeroDivisionError: division by zero
Code language: Python (python)4, Anda perlu menangkap pengecualiandef divide(a, b): try: return a / b except ZeroDivisionError as ex: return None
Code language: Python (python)6try: ... except <ExceptionType1> as ex: log(ex) except <ExceptionType2> as ex: log(ex)
Code language: Python (python)_2Keluaran
try: ... except <ExceptionType1> as ex: log(ex) except <ExceptionType2> as ex: log(ex)
Code language: Python (python)_3Merupakan praktik yang baik untuk mengajukan pengecualian alih-alih mengembalikan
ZeroDivisionError: division by zero
Code language: Python (python)6 dalam kasus khususKecuali 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, dandef divide(a, b): try: return a / b except ZeroDivisionError as ex: return None
Code language: Python (python)0Jika 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)_4Ini mengeluarkan kesalahan berikut
try: ... except <ExceptionType1> as ex: log(ex) except <ExceptionType2> as ex: log(ex)
Code language: Python (python)_5Akses
def divide(a, b): try: return a / b except ZeroDivisionError as ex: return None
Code language: Python (python)_1 menyebabkan pengecualiandef divide(a, b): try: return a / b except ZeroDivisionError as ex: return None
Code language: Python (python)0. Namun, jika Anda menukar klausadef divide(a, b): return a / b
def divide(a, b): try: return a / b except ZeroDivisionError as ex: return None
Code language: Python (python)9 pertama dandef divide(a, b): try: return a / b except ZeroDivisionError as ex: return None
Code language: Python (python)0 kedua seperti initry: ... except <ExceptionType1> as ex: log(ex) except <ExceptionType2> as ex: log(ex)
Code language: Python (python)_6Keluaran
try: ... except <ExceptionType1> as ex: log(ex) except <ExceptionType2> as ex: log(ex)
Code language: Python (python)_7Pengecualian masih
def divide(a, b): try: return a / b except ZeroDivisionError as ex: return None
Code language: Python (python)_0 tetapi pesan berikut ini menyesatkanPenangan 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)_8Ini setara dengan yang berikut ini
try: ... except <ExceptionType1> as ex: log(ex) except <ExceptionType2> as ex: log(ex)
Code language: Python (python)_9Penangan 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)0Dalam 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 moduldef divide(a, b): try: return a / b except ZeroDivisionError as ex: return None
Code language: Python (python)8Fungsi
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 nilairesult = 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 dariresult = divide(10, 0) if result is not None: print('result:', result) else: print('Invalid inputs')
Code language: Python (python)1result = divide(10, 0) if result is not None: print('result:', result) else: print('Invalid inputs')
Code language: Python (python)_2 adalah turunan dari tipe pengecualianresult = 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 angkatry: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)
Code language: Python (python)1Keluaran
try: ... except (<ExceptionType1>, <ExceptionType2>) as ex: log(ex)
Code language: Python (python)2Keluaran 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