CodeGym /Kurslar /Python SELF AZ /İstisnaların emalı

İstisnaların emalı

Python SELF AZ
Səviyyə , Dərs
Mövcuddur

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, elsefinally 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 elsefinally operatorları

tryexcept operatorlarından başqa, daha iki opsional operator var: elsefinally. İ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.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION