İstisna ve İstisna Sınıfları
Genel olarak bir istisna, alışılmadık bir durumdur. İstisna genellikle hataları gösterir, ancak bazen bir prosedürü erken sonlandırma veya bir kaynak yetersizliğinden kurtulma gibi durumlarda kasıtlı olarak programa koyarlar. Bir dosyanın sonunu okumak veya sıfıra bölmek gibi koşulları belirten yerleşik istisnalar vardır. Özel istisna adı verilen kendi istisnalarımızı tanımlayabiliriz.
İstisna işleme, hataları incelikle işlemenizi ve bu konuda anlamlı bir şeyler yapmanızı sağlar. İstisna işlemenin iki bileşeni vardır: "fırlatma" ve "yakalama".
İstisnayı Tanımlama (Hatalar)
Python'da meydana gelen her hata, hata türüne göre tanımlanan bir hata durumuna neden olan bir istisna ile sonuçlanır.
>>> #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.
Yakalama / Yakalama İstisnası
Programınızda olağandışı bir şey olduğunda ve bunu istisna mekanizmasını kullanarak halletmek istediğinizde, 'bir istisna atarsınız'. Try ve exclu anahtar sözcükleri istisnaları yakalamak için kullanılır. Bir try bloğu içinde bir hata oluştuğunda, Python onu işlemek için blok dışında bir eşleşme arar. Bir tane varsa, yürütme oraya atlar.
sözdizimi
try:
#write some code
#that might throw some exception
except <ExceptionType>:
# Exception handler, alert the user
Try cümlesindeki kod, ifade bazında çalıştırılacaktır.
Bir istisna meydana gelirse, try bloğunun geri kalanı atlanacak ve exclude cümlesi çalıştırılacaktır.
try:
some statement here
except:
exception handling
Programınızda herhangi bir hata işleme mekanizması kullanmadığınızda ne olacağını görmek için biraz kod yazalım.
number = int(input('Please enter the number between 1 & 10: '))
print('You have entered number',number)
Yukarıdaki program, kullanıcı bir sayı girdiği sürece doğru çalışacaktır, ancak kullanıcılar başka bir veri türü (bir dizi veya liste gibi) koymaya çalışırsa ne olur.
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'"
Artık ValueError bir istisna türüdür. Yukarıdaki kodu istisna işleme ile yeniden yazmaya çalışalım.
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)
Programı çalıştırırsak ve bir dizi (sayı yerine) girersek, farklı bir sonuç aldığımızı görebiliriz.
Previous code with exception handling
Enter number between 1 > 10: 'Hi'
Error..numbers only
İstisnaları Artırma
İstisnalarınızı kendi yöntemlerinizden yükseltmek için, yükselt anahtar kelimesini şu şekilde kullanmanız gerekir
raise ExceptionClass(‘Some Text Here’)
Bir örnek alalım
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')
Programı çalıştırın ve pozitif tamsayı girin.
Beklenen çıktı
Enter your age: 12
Entered Age is even
Ancak negatif bir sayı girmeye çalıştığımızda,
Beklenen çıktı
Enter your age: -2
Only positive integers are allowed
Özel istisna sınıfı oluşturma
BaseException sınıfını veya BaseException alt sınıfını Genişleterek özel bir istisna sınıfı oluşturabilirsiniz.
Yukarıdaki diyagramdan Python'daki istisna sınıflarının çoğunun BaseException sınıfından uzandığını görebiliriz. BaseException sınıfından veya alt sınıfından kendi istisna sınıfınızı türetebilirsiniz.
NegativeNumberException.py adlı yeni bir dosya oluşturun ve aşağıdaki kodu yazın.
class NegativeNumberException(RuntimeError):
def __init__(self, age):
super().__init__()
self.age = age
Yukarıdaki kod, yalnızca super () __ init __ () kullanarak üst sınıf oluşturucusunu çağıran ve yaşı ayarlayan NegativeNumberException adında yeni bir istisna sınıfı oluşturur.
Şimdi kendi özel istisna sınıfınızı oluşturmak için, bir miktar kod yazacak ve yeni istisna sınıfını içe aktaracaksınız.
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')
Çıktı
Enter your age: -2
Only positive integers are allowed
Özel bir Exception sınıfı oluşturmanın başka bir yolu.
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)
Çıktı
Caught: My Useful Error Message!
İstisna hiyerarşisi
Yerleşik istisnalar için sınıf hiyerarşisi şöyledir:
+-- 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