Python dərs 7 -Exceptions
Proqramda bəzən bizdən asılı olan və ya olmayan xətalar çıxa bilir. Həmçinin 0-a bölmə kimi istisna hallar runtime-da xəta verə bilir. Pythonda try except ilə bu xətaları tutub lazımi əməliyyatlar edə bilirik.Məsələn aşağıdakı koda baxaq.
print(5/0)
Bu kod bizə ZeroDivisionError: division by zero xətası verəcək. try except ilə biz bu xətanı tutub istifadəçiyə daha fərqli şəkildə məlumat verə və ya başqa əməliyyat apara bilərik. Məsələn deyək ki istəyirik bu kimi hallarda proqram bizə o-a bölmək olmaz desin. Onda bu kodu aşağıdakı kimi yaza bilərik.
try:
print(5/0)
except:
print(“0-a bölmək olmaz”)
try except ümumi şəkildə aşağıdakı kimi yazılır.
try:
kodlar
except error1:
error1 xetası baş verəndə isleyecek hisse
except error2:
error2 xetası baş verəndə isleyecek hisse
…
finally:
Butun hallarda calisacaq kodlar
Aşağıdakı koda baxaq.
try:
a=5
b=0
print(a+”test”)#TypeError
print(a/b)#ZeroDivisionError
except TypeError:
print(“String ve int toplana bilməz”)
except ZeroDivisionError:
print(“0-a bölmək olmaz”)
Kod çalışanda String ve int toplana bilməz yazılacaq. Çünki TypeError baş verdiyi üçün kod except TypeError hissəsinə keçir və onu çalışdırır.
try:
a=5
b=0
print(a/b)#ZeroDivisionError
print(a+”test”)#TypeError
except TypeError:
print(“String ve int toplana bilməz”)
except ZeroDivisionError:
print(“0-a bölmək olmaz”)
Bu kod isə 0-a bölmək olmaz deyəcək.
Bütün xətalar BaseException klasından törəyib. Ümumiyyətlə isə məsəlçün 0-a bölmə xətası ZeroDivisionError bir neçə klasın alt klasıdır. Yəni ZeroDivisionError ilə tuttduğumuz xətanı ArithmeticError, Exception və BaseException ilə də tuta bilərik. Base və child xətaların ən çox işlədilənləri bu şəkildədir. Bunlar built-in yəni pythonla gələn xətalardır.
BaseException
+ — SystemExit
+ — KeyboardInterrupt
+ — Exception
+ — StopIteration
+ — StopAsyncIteration
+ — ArithmeticError
| + — FloatingPointError
| + — OverflowError
| + — ZeroDivisionError
+ — ImportError
| + — ModuleNotFoundError
+ — LookupError
| + — IndexError
| + — KeyError
+ — OSError
+ — ValueError
Aşağıdakı koda baxaq.
try:
a=5
b=0
print(a+”test”)#TypeError
print(a/b)#ZeroDivisionError
except BaseException:
print(“BaseException”)
except TypeError:
print(“String ve int toplana bilməz”)
except ZeroDivisionError:
print(“0-a bölmək olmaz”)
Bu kodu işlətdikdə ekrana BaseException yazdıracaq.Bir başqa koda baxaq.
try:
a=5
b=0
print(a+”test”)#TypeError
print(a/b)#ZeroDivisionError
except ArithmeticError:
print(“ArithmeticError”)
except Exception:
print(“Exception”)
except ZeroDivisionError:
print(“0-a bölmək olmaz”)
except BaseException:
print(“BaseException”)
except TypeError:
print(“String ve int toplana bilməz”)
Bu kod işləyəndə Exception yazdıracaq.
Xətanı bu şəkildə də yazdıra bilərik.
try:
a=5
b=0
print(a/b)#ZeroDivisionError
except ZeroDivisionError as ex:
print(“Sistem xətası:”,ex)
result: Sistem xətası: divided by zero
try:
a=5
b=0
print(a/b)#ZeroDivisionError
except ZeroDivisionError as ex:
print(“Sistem xətası:”,ex)
finally:
print(“final”)
result:
Sistem xətası: divided by zero
final
Bu xətalardan başqa özümüz də xəta olmasını istəyə bilərik. Tutaq ki mənfi ədəd daxil edəndə xəta verilməsini istəyirik.Bu halda biz raise istifadə edəcəyik.
while True:
a=int(input(“Eded daxil edin:”))
if a<0:
raise ValueError(“Menfi eded daxil etmek olmaz”)
Bu xətanı da belə tuta bilərik.
try:
while True:
a=int(input(“Eded daxil edin:”))
if a<0:
raise ValueError(“Menfi eded daxil etmek olmaz”)
except ValueError as ex:
print(ex)
Bu xətalardan başqa özümüz yeni xəta tipi də yarada bilərik. Bu zaman bizim yazdığımız yeni xəta klasımız Exception klasından törəməlidir. Tutaq ki test üçün sadə bir myexception klasımız yazaq.
class MyException(Exception):
def __init__(self):
self.code = 999999
self.message=”Bu exception test üçün yaradılıb”
def __str__(self):
return self.message
try:
while True:
a=int(input(“Eded daxil edin:”))
if a<0:
raise MyException()
except MyException as ex:
print(ex)
MyException klasımızı Exception klasından törətdik. Sonra raise ilə bu exceptionumuzu yaratdıq.try catch ilə öz yaratdığımız xətanı tutduq və ekrana yazdırdıq.