Python İstisnası

Bu təlimatda istisnanın sintaksis səhvindən necə fərqləndiyini və koddakı Python istisnasını necə idarə edəcəyimizi görək. Bir proqramın normal icra axını aşağıdakılar tərəfindən pozula bilər:

  • Söz düzümü səhvi
  • İstisna

Sintaksis səhvləri Python Exception-dan nə ilə fərqlənir?

Söz düzümü səhvi

Sintaksis xətası, tərtibçi tərəfindən tutulan bir sıra simvol və ya jetonların sintaksisindəki bir səhvdir. Proqramın uğurla tərtib edilməsi üçün sintaksis səhvləri düzəldilməlidir. Sintaksis səhvinin bir neçə nümunəsi:

>>> print(1233))
  File "<stdin>", line 1
    print(1233))
               ^
SyntaxError: invalid syntax

Ok işarəsi kodu təhlil edərkən bir sintaksis səhvinin olduğunu göstərir. Xəta həddindən artıq mötərizədədir. İstənməyən mötərizələri çıxarıb kodu düzəldin və kodu çalıştırın.

>>> if True:
... print('YES')
  File "<stdin>", line 2
    print('YES')
        ^
IndentationError: expected an indented block

Yuxarıdakı kod bir səhvlə üzləşdi, çünki if ifadəsi ilə aşağıdakı sətir arasında heç bir girinti yoxdur. Xətanı həll etmək üçün girintini düzəldin.

Python İstisnası

İstisna xətası kod sintaktik olaraq düzgün olduqda, lakin kodun özündə bir səhv olduqda meydana gələcək. Bir Python istisna nümunəsi:

>>> print(0/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

Sadəcə 'İstisna Xətası' göstərmək əvəzinə, Python hansı istisna səhvinə rast gəldiyinizi açıq şəkildə qeyd edir. Bu vəziyyətdə 'ZeroDivisionError' olur. Python yalnız özünə aid deyil daxili istisnalar həm də proqramçılara Python-da öz istisnalarını yaratmağa imkan verir.

Python-da bir istisna qaldırmaq üçün necə

Bir proqramçı olaraq şərtlərə əsasən bir istisna atmağı seçə bilərsiniz.

Müəyyən bir vəziyyət baş verərsə, Python'da bir istisna atmaq üçün 'qaldır' açar sözünü istifadə edin.

x=5
while(x>=0):
    print(x)
    x-=1
else:
    raise Exception("Negative numbers are not allowed")

Yuxarıda göstərilən kodun nəticəsi belə olacaq:

5
4
3
2
1
0
Traceback (most recent call last):
  File "sample.py", line 6, in <module>
    raise Exception("Negative numbers are not allowed")
Exception: Negative numbers are not allowed

Bu proqram dayandırılır və konsolda icra mesajını göstərir.

Python-da AssertionError Exception

Modulu çalıştırmadan əvvəl, assert ifadəsini istifadə edərək, bir proqramçı kodu yazarkən şərtin doğru olduğunu elan edə bilər. Vəziyyət Doğrudursa, növbəti kod sətri icra ediləcək, əks halda proqram bir AssertionError istisnası gətirir.

Python İstisnasıPin

x=5
assert x==5

Yuxarıdakı kod heç bir səhv atmır, çünki təsdiqləmə şərtləri doğrudur. İddianın uğursuz olması üçün kodu dəyişdirin və kodu yenidən işə salın.

File "sample.py", line 2, in <module>
    assert x==7
AssertionError

Proqram bir istisna ilə qarşılaşdıqda, proqram birdən-birə dayanır. Proqramınızın istisnadan sonra da davam etməsini istəyirsinizsə, proqramdakı istisnanı idarə etməlisiniz.

Python İstisnası ilə işləmə

Pythondakı istisnanı, try and except block istifadə edərək idarə edirik. Proqram işlədildikdə, cəhd blokunun içərisinə yazılmış kod yerinə yetiriləcəkdir. Try blokunun içərisindəki kodun səbəb olduğu bir istisna olduqda, istisna blokun içərisindəki kod icra ediləcəkdir. Yəni istisna blokun içindəki kod, cəhd blokunun içərisindəki kodun yaratdığı istisnaya cavabdır.

try:
    {
    Code gets executed normally when the program runs
    }
except:
    {
    Code gets executed if there is an exception
    }

Artıq gördüyümüz kimi, sintaksis səhvləri istisna deyil. Python istisnası halında, proqram sintaktik olaraq düzgün kodun səbəb olduğu işlənməmiş istisnalar səbəbiylə birdən dayanır. Pythondakı istisnanı idarə etmək üçün bir istisna blok əlavə edə bilərsiniz və proqram bundan sonra da davam edir.

Python'da IndexError İstisnası

Pythondakı IndexError istisnasını necə idarə edəcəyimizə dair bir nümunəyə baxaq:

def get_item_by_index(arr,ind):
    l=len(arr)
    print(arr[ind])

l=[1,2,3,4,5]

The funksiyası get_item_by_index () bir giriş və siyahını qəbul edir. İndeks hüdudlardadırsa, o indeksin siyahı elementini yazdırır. Əks təqdirdə bir səhv alacağıq.

1
Traceback (most recent call last):
  File "sample.py", line 7, in <module>
    get_item_by_index(l,-6)
  File "sample.py", line 4, in get_item_by_index
    print(arr[ind])
IndexError: list index out of range

Gəlin cəhd blokunun içindəki funksiyanı çağıraq:

try:
    get_item_by_index(l,-5)
    get_item_by_index(l,-6)
except:
    pass
print('Exception is handled properly')

Blok xaricində, Python istisnasını sadə bir 'keçid' ifadəsi ilə işləyirik. İndi nəticə:

1
Exception is handled properly

Siyahının hüdudlarından kənarda bir indeks keçsək, heç bir şey əldə etmərik. Əks təqdirdə, etibarlı bir indeks üçün həmin indeks üçün siyahı elementini alırıq. Proqram istisna olduğu üçün qəzaya uğramır və istisna blokundan sonra növbəti sətri icra etməyə başlayır.

Keçid ifadəsi əvəzinə səhv barədə bir məlumat verə bilərik.

try:
    get_item_by_index(l,-5)
    get_item_by_index(l,-6)
except:
    print('Index out of limits')
print('Exception is handled properly')

Kodu yenidən çalıştırın və nəticə belə olacaq:

1
Index out of limits
Exception is handled properly

Yuxarıda göstərilən kod yalnız bir istisna olsa da işləməyə davam etməklə yanaşı, istisna səbəbi ilə hansı növ səhvlərin atıldığı barədə məlumatları da göstərir.

Dəqiq səhvi görmək üçün funksiyanın atdığı həqiqi səhvləri tutmalıyıq.

try:
    get_item_by_index(l,-5)
    get_item_by_index(l,-6)
except IndexError as e:
    print(e)
    print('Index out of limits')
1
list index out of range
Index out of limits

İlk mesaj, indeks siyahısının xaricində bir indeks əldə etdiyinizi izah edən IndexError'dur. İkinci mesaj, konsola yazdırdığımız mesajdır.

Bu nümunədə öz funksiyamızı yaratdıq və IndexError-u tutduq və səhv mesajını konsolda göstərdik.

Python'da FileNotFoundError İstisnası

Bir sənəd açdığımız və Python istisnasını idarə etdiyimiz başqa bir nümunəyə baxaq.

try:
    with open('input.txt') as file:
        input_data=file.read()
except:
    print('Could not open "input.txt"')

Əgər belə bir 'input.txt' faylı yoxdursa, aşağıdakı xətanı alacaqsınız:

Could not open "input.txt"

Bu, konsola yazdırdığımız səhv mesajıdır və proqram işləməyə davam edir. İstifadə etmək üçün bir çox daxili istisnalar mövcuddur. Onlardan birini seçib ətraflı müzakirə edəcəyik.

İstədiyiniz bir fayl və ya qovluq tapılmadıqda, FileNotFoundError istisnasından istifadə edə bilərik.

İstisnanı tutun və ekrana yazdırın.

except FileNotFoundError as e:
    print(e)
    print('Could not open "input.txt"')

Fayl tapılmadıqda səhv:

[Errno 2] No such file or directory: 'input.txt'
Could not open "input.txt"

Try blokunun daxilində birdən çox funksiya çağırışı

Ayrıca, cəhd bloku içərisində birdən çox funksiya çağırışı edə bilərik və müxtəlif piton istisnalarını idarə edə bilərik.

try:
    get_item_by_index(l,-6)
    with open('file.log') as file:
        read_data = file.read()
except FileNotFoundError as e:
    print(e)
except IndexError as e:
    print(e)

İki səhv mesajı gözləyirik, biri indeks xətası, digəri fayl tapılmayan səhv. Nəticəni yoxlayaq:

list index out of range

Yalnız bir səhv mesajı almışıq, çünki istisna baş verən kimi sınaq blokundan çıxacaq. Try blokunun içindəki kod istisna ilə qarşılaşana qədər işləyir.

Etibarlı bir indeks keçirsək və sənəd tapılmasa, aşağıdakı mesajı alacağıq.

5
[Errno 2] No such file or directory: 'file.log'

Bütün səhvləri, hətta gözlənilməz olanları belə maskaladığı üçün, çılpaq istifadə etməkdən çəkinin. Bunun əvəzinə xüsusi Python istisna siniflərinə müraciət edin və bunları idarə edin.

Başqa maddə

Else ifadəsinin içindəki kod yalnız istisna olmadığı təqdirdə icra edilir.

try: 
  { 
    Code gets executed normally when the program runs 
  } 
except: 
  { 
    Code gets executed if there is an exception 
  }
else:
  {
    Code gets executed if only there is no exception 
  }

Aşağıdakı nümunə else deyiminin istifadəsini izah edir.

try:
    get_item_by_index(l,-1)
except IndexError as e:
    print(e)
else:
    print('Else is getting executed')

Başqa hissədəki ifadənin çap olunduğunu görmək üçün etibarlı bir indeks keçir.

5
Else is getting executed

Else ifadəsinin içərisində istisnalar da əldə edə bilərik.

try:
    get_item_by_index(l,-1)
except IndexError as e:
    print(e)
else:
    try:
        with open('file.log') as file:
            read_data = file.read()
    except FileNotFoundError as e:
        print(e)

Etibarlı bir indeks keçirin və nəticəni yoxlayın:

5
[Errno 2] No such file or directory: 'file.log'

Etibarlı indeksdən keçdiyimiz üçün istisna yoxdur, bu səbəbdən else ifadəsinin içərisindəki kod icra edilir. Else ifadəsinin içərisində bir cəhd və istisna ifadəsi var. Else blokunun içərisində bir istisna varsa, tutulacaq və işlənəcəkdir.

nəhayət

Nəhayət blok kod icra edildikdən sonra bir az təmizlənir.

try: 
  { 
    Code gets executed normally when the program runs 
  } 
except: 
  { 
    Code gets executed if there is an exception 
  } 
else: 
  { 
    Code gets executed if only there is no exception 
  }
finally:
  {
    Always run this code
  }

Nəhayət əvvəlki kodu blok əlavə edək.

try:
    get_item_by_index(l,-1)
except IndexError as e:
    print(e)
else:
    try:
        with open('file.log') as file:
            read_data = file.read()
    except FileNotFoundError as e:
        print(e)
finally:
    print('Cleaning Up')

Nəhayət blokun içərisindəki kod nə olursa olsun yerinə yetirilir. Try daxilində bir istisna olub olmadığının və ya başqa bir ifadənin olması və ya heç bir istisnanın olmaması vacib deyil.

5
[Errno 2] No such file or directory: 'file.log'
Cleaning Up

xülasə

Python istisnası üçün xatırlamaq lazım olan əsas şeylər:

  • İstədiyiniz zaman bir istisna atmaq üçün qaldır sözünü istifadə edin.
  • müəyyən bir şərt üçün açar söz yoxlamalarını təsdiq edin. Vəziyyət Yanlışdırsa, bir istisna gətirir.
  • Try blokunun içərisindəki kod, Python istisnası ilə qarşılaşana qədər icra edilir.
  • istisna olmaqla, blok blokunun içərisindəki kod tərəfindən atılan istisnanı tutur və idarə edir.
  • Else blokunun içindəki kod yalnız istisna olmadığı təqdirdə icra edilir.
  • Nəhayət blokun içərisindəki kod, Python istisnasından asılı olmayaraq hər zaman icra edilir.
Translate »