3.1 İstisnaların tutulması
İstisnalar haqqında bu qədər çox danışmazdıq, əgər sadəcə onlara baxmağa məcbur olsaydıq. İstisnalar — Python proqramınızın işləyə biləcəyi xüsusi obyektlərdir. İstisnaların işlənməsi — proqramlaşdırmanın vacib aspektidir, bu da proqramların etibarlılığını və davamlılığını yaxşılaşdırmağa imkan verir.
Python-da istisnaların tutulması və işlənməsi üçün try
, except
, else
və finally
konstruksiyaları istifadə edilir. Bu konstruksiyalar proqramın icrası zamanı baş verən səhvləri tutmağa və müvafiq hərəkətləri yerinə yetirməyə imkan verir.
try-except
konstruksiyası
try-except
konstruksiyası istisnaların tutulması və işlənməsi üçün istifadə olunur. try
bloku istisna yarada bilən kodu, except
bloku isə istisna baş verərsə icra olunacaq kodu özündə saxlayır.
Nümunə:
try:
result = 10 / 0
except ZeroDivisionError:
print("Xəta: sıfıra bölmə.")
Əgər try
blokunun daxilindəki kodda ZeroDivisionError
istisnası baş verərsə, o zaman bu blok except
tərəfindən tutulacaq və print()
çağırışı yerinə yetiriləcək.
Bir neçə istisnanın işlənməsi
Bir neçə növ istisnanı işləmək üçün onları müxtəlif except
bloklarında göstərə bilərsiniz.
try:
result = int("abc")
except ZeroDivisionError:
print("Xəta: sıfıra bölmə.")
except ValueError:
print("Xəta: səhv dəyər.")
Bütün istisnaların tutulması
Əgər bütün istisnaları tutmaq istəyirsinizsə, konkret istisna növünü göstərmədən except
blokundan istifadə edə bilərsiniz. Ancaq bu tövsiyə edilmir, çünki bu, xətaları tapmaqda çətinlik yarada bilər və mühüm səhvləri gizlədə bilər.
try:
result = 10 / 0
except:
print("Xəta baş verdi.")
3.2 else
və finally
operatorları
try
və except
operatorlarından başqa, daha iki opsional operator var: else
və finally
. İndi bunlar haqqında bir az daha ətraflı danışacam.
try-except-else
Konstruktoru
else
bloku, əgər try
blokunda heç bir istisna yaranmasa, kodun icrası üçün istifadə olunur.
try:
result = 10 / 2
except ZeroDivisionError:
print("Xəta: sıfra bölmə.")
else:
print(f"Nəticə: {result}")
try-except-finally
Konstruktoru
finally
bloku istisna yaranıb-yaranmamasından asılı olmayaraq həmişə icra olunan kodu əhatə edir. Bu, resursların sərbəst buraxılması və ya yekun əməliyyatların həyata keçirilməsi üçün faydalıdır.
try:
result = 10 / 0
except ZeroDivisionError:
print("Xəta: sıfra bölmə.")
finally:
print("Bu blok həmişə icra olunur.")
Tam nümunə: try-except-else-finally
Nümunə:
try:
result = 10 / 2
except ZeroDivisionError:
print("Xəta: sıfra bölmə.")
else:
print(f"Nəticə: {result}")
finally:
print("Bu blok həmişə icra olunur.")
3.3 try-except-else-finally
nümunəsi
Gəlin hansısa böyük bir real nümunəni nəzərdən keçirək. Məsələn, biz diskin üzərindəki bir fayldan məlumat oxumağa çalışırıq — bundan daha asan nə ola bilər ki?
file = open("file.txt", "r")
content = file.read()
print(content)
Nələr yanlış gedə bilər? Məsələn, hər şey:
- Fayl mövcud olmaya bilər. Onu təsadüfən silə bilərlər, yaza bilərlər, ya da proqramınız ümumiyyətlə başqa bir kompüterdə işləyir, harada ki o heç vaxt olmamışdı.
- Fayl oxuma xətası. Proqramınızın ona çıxışı yoxdur, çünki fayl elə bir direktoriya yerləşir ki, oraya admin icazələri lazımdır.
- Başqa bir proqram hazırda bu fayla yazır və onu oxumaq mümkün deyil — o proqramın fayla müstəsna çıxışı var.
Sizin üçün kifayət etmədi? Onda unutmayın ki, faylla işlədiyiniz hər hansı bir mərhələdə xəta baş verərsə, faylı mütləq «bağlamaq» lazımdır ki, əməliyyat sistemi faylla iş üçün ayrılmış resursları sərbəst buraxsın.
Beləliklə, real kod təxminən belə görünəcək:
try:
file = open("non_existent_file.txt", "r")
content = file.read()
except FileNotFoundError:
print("Xəta: fayl tapılmadı.")
except IOError:
print("Xəta: giriş-çıxış xətası.")
else:
print(content)
finally:
if 'file' in locals() and not file.closed:
file.close()
print("Fayl bağlandı.")
Real dünyaya xoş gəldiniz, burada yalnız «işlək ssenari» üçün deyil, həm də yanlış gedə biləcək bütün mümkün ssenarilərə görə kod yazmalısınız.
Yaxşı, sizi qorxutmayacam — bu göründüyündən daha asandır. Sadəcə başa düşmək lazımdır ki, nədir sərhəd şərtləri (corner cases
) və vaxtında standart xətaların yoxlanışını əlavə etmək lazımdır. Qalanını müasir framework-lər sizin əvəzinizə edəcək.
GO TO FULL VERSION