Kelas Pengecualian dan Pengecualian

Secara umum, pengecualian adalah kondisi yang tidak biasa. Pengecualian biasanya menunjukkan kesalahan tetapi terkadang mereka sengaja dimasukkan ke dalam program, dalam kasus seperti menghentikan prosedur lebih awal atau memulihkan dari kekurangan sumber daya. Ada sejumlah pengecualian bawaan, yang menunjukkan kondisi seperti membaca setelah akhir file, atau membaginya dengan nol. Kita bisa mendefinisikan pengecualian kita sendiri yang disebut pengecualian khusus.

Penanganan pengecualian memungkinkan Anda menangani kesalahan dengan baik dan melakukan sesuatu yang berarti. Penanganan pengecualian memiliki dua komponen: "melempar" dan 'menangkap'.

Mengidentifikasi Pengecualian (Kesalahan)

Setiap kesalahan yang terjadi pada Python menghasilkan pengecualian yang merupakan kondisi kesalahan yang diidentifikasi oleh jenis kesalahannya.

>>> #Exception
>>> 1/0
Traceback (most recent call last):
   File "<pyshell#2>", line 1, in <module>
      1/0
ZeroDivisionError: division by zero
>>>
>>> var = 20
>>> print(ver)
Traceback (most recent call last):
   File "<pyshell#5>", line 1, in <module>
      print(ver)
NameError: name 'ver' is not defined
>>> #Above as we have misspelled a variable name so we get an NameError.
>>>
>>> print('hello)

SyntaxError: EOL while scanning string literal
>>> #Above we have not closed the quote in a string, so we get SyntaxError.
>>>
>>> #Below we are asking for a key, that doen't exists.
>>> mydict = {}
>>> mydict['x']
Traceback (most recent call last):
   File "<pyshell#15>", line 1, in <module>
      mydict['x']
KeyError: 'x'
>>> #Above keyError
>>>
>>> #Below asking for a index that didn't exist in a list.
>>> mylist = [1,2,3,4]
>>> mylist[5]
Traceback (most recent call last):
   File "<pyshell#20>", line 1, in <module>
      mylist[5]
IndexError: list index out of range
>>> #Above, index out of range, raised IndexError.

Pengecualian Penangkapan / Perangkap

Ketika sesuatu yang tidak biasa terjadi dalam program Anda dan Anda ingin menanganinya menggunakan mekanisme pengecualian, Anda 'melempar pengecualian'. Kata kunci mencoba dan kecuali digunakan untuk menangkap pengecualian. Setiap kali terjadi kesalahan dalam blok percobaan, Python mencari blok kecuali yang cocok untuk menanganinya. Jika ada, eksekusi melompat ke sana.

sintaksis

try:
   #write some code
   #that might throw some exception
except <ExceptionType>:
   # Exception handler, alert the user

Kode dalam klausa percobaan akan dieksekusi pernyataan demi pernyataan.

Jika pengecualian terjadi, sisa blok percobaan akan dilewati dan klausul pengecualian akan dijalankan.

try:
   some statement here
except:
   exception handling

Mari menulis beberapa kode untuk melihat apa yang terjadi jika Anda tidak menggunakan mekanisme penanganan kesalahan dalam program Anda.

number = int(input('Please enter the number between 1 & 10: '))
print('You have entered number',number)

Program di atas akan bekerja dengan baik selama pengguna memasukkan angka, tetapi apa yang terjadi jika pengguna mencoba menempatkan beberapa tipe data lain (seperti string atau daftar).

Please enter the number between 1 > 10: 'Hi'
Traceback (most recent call last):
   File "C:/Python/Python361/exception2.py", line 1, in <module>
      number = int(input('Please enter the number between 1 & 10: '))
ValueError: invalid literal for int() with base 10: "'Hi'"

Sekarang ValueError adalah tipe pengecualian. Mari kita coba menulis ulang kode di atas dengan penanganan pengecualian.

import sys

print('Previous code with exception handling')

try:
   number = int(input('Enter number between 1 > 10: '))

except(ValueError):
   print('Error..numbers only')
   sys.exit()

print('You have entered number: ',number)

Jika kita menjalankan program, dan memasukkan string (bukan angka), kita dapat melihat bahwa kita mendapatkan hasil yang berbeda.

Previous code with exception handling
Enter number between 1 > 10: 'Hi'
Error..numbers only

Meningkatkan Pengecualian

Untuk meningkatkan pengecualian Anda dari metode Anda sendiri, Anda perlu menggunakan kata kunci naikkan seperti ini

raise ExceptionClass(‘Some Text Here’)

Mari kita ambil contoh

def enterAge(age):
   if age<0:
      raise ValueError('Only positive integers are allowed')
   if age % 2 ==0:
      print('Entered Age is even')
   else:
      print('Entered Age is odd')

try:
   num = int(input('Enter your age: '))
   enterAge(num)
except ValueError:
   print('Only positive integers are allowed')

Jalankan programnya dan masukkan bilangan bulat positif.

Output yang Diharapkan

Enter your age: 12
Entered Age is even

Tetapi ketika kami mencoba memasukkan angka negatif yang kami dapatkan,

Output yang Diharapkan

Enter your age: -2
Only positive integers are allowed

Membuat kelas pengecualian khusus

Anda dapat membuat kelas pengecualian kustom dengan Memperluas kelas atau subkelas BaseException dari BaseException.

Dari diagram di atas kita dapat melihat sebagian besar kelas pengecualian dalam Python berasal dari kelas BaseException. Anda bisa mendapatkan kelas pengecualian Anda sendiri dari kelas BaseException atau dari subkelasnya.

Buat file baru bernama NegativeNumberException.py dan tulis kode berikut.

class NegativeNumberException(RuntimeError):
   def __init__(self, age):
      super().__init__()
      self.age = age

Kode di atas membuat kelas pengecualian baru bernama NegativeNumberException, yang hanya terdiri dari konstruktor yang memanggil konstruktor kelas induk menggunakan super () __ init __ () dan menyetel usia.

Sekarang untuk membuat kelas pengecualian khusus Anda sendiri, akan menulis beberapa kode dan mengimpor kelas pengecualian baru.

from NegativeNumberException import NegativeNumberException
def enterage(age):
   if age < 0:
      raise NegativeNumberException('Only positive integers are allowed')

   if age % 2 == 0:
      print('Age is Even')

   else:
      print('Age is Odd')

try:
   num = int(input('Enter your age: '))
   enterage(num)
except NegativeNumberException:
   print('Only positive integers are allowed')
except:
   print('Something is wrong')

Keluaran

Enter your age: -2
Only positive integers are allowed

Cara lain untuk membuat kelas Exception kustom.

class customException(Exception):
   def __init__(self, value):
      self.parameter = value

   def __str__(self):
      return repr(self.parameter)
try:
   raise customException('My Useful Error Message!')
except customException as instance:
   print('Caught: ' + instance.parameter)

Keluaran

Caught: My Useful Error Message!

Hierarki pengecualian

Hierarki kelas untuk pengecualian bawaan adalah -

+-- SystemExit 
+-- KeyboardInterrupt 
+-- GeneratorExit 
+-- Exception 
+-- StopIteration 
+-- StopAsyncIteration 
+-- ArithmeticError 
| +-- FloatingPointError 
| +-- OverflowError 
| +-- ZeroDivisionError 
+-- AssertionError 
+-- AttributeError 
+-- BufferError 
+-- EOFError 
+-- ImportError 
+-- LookupError 
| +-- IndexError 
| +-- KeyError 
+-- MemoryError 
+-- NameError 
| +-- UnboundLocalError 
+-- OSError 
| +-- BlockingIOError 
| +-- ChildProcessError 
| +-- ConnectionError 
| | +-- BrokenPipeError 
| | +-- ConnectionAbortedError 
| | +-- ConnectionRefusedError 
| | +-- ConnectionResetError 
| +-- FileExistsError 
| +-- FileNotFoundError 
| +-- InterruptedError 
| +-- IsADirectoryError 
| +-- NotADirectoryError 
| +-- PermissionError 
| +-- ProcessLookupError 
| +-- TimeoutError 
+-- ReferenceError 
+-- RuntimeError 
| +-- NotImplementedError 
| +-- RecursionError 
+-- SyntaxError 
| +-- IndentationError
| +-- TabError 
+-- SystemError 
+-- TypeError 
+-- ValueError 
| +-- UnicodeError 
| +-- UnicodeDecodeError 
| +-- UnicodeEncodeError 
| +-- UnicodeTranslateError 
+-- Warning 
+-- DeprecationWarning 
+-- PendingDeprecationWarning 
+-- RuntimeWarning 
+-- SyntaxWarning 
+-- UserWarning 
+-- FutureWarning 
+-- ImportWarning 
+-- UnicodeWarning 
+-- BytesWarning 
+-- ResourceWarning