Close
Python logo

Python dasturlash tili: 11-dars.

Istisnolar (Exceptions)

Ba’zan dastur ishlashi davomida istisno holatlar yuzaga kelishi mumkin. Misol uchun, mavjud bo’lmagan faylni o’qishga bo’lgan harakat yoki dasturdagi no’malum buyruqlar. Bunday holatlar exception’lar yordamida hal qilinadi.

Xatoliklar

Agar biz print funksiyasini Print shaklida chaqiradigan bo’lsak, python interpretatori bizga sintaksis xatolikni ko’rsatadi.

>>> Print(“Salom dunyo”)

Traceback (most recent call last):

File “<stdin>”, line 1, in <module>

NameError: name ‘Print’ is not defined

>>> print(“Salom dunyo”)

Salom dunyo

E’tibor bergan bo’lsangiz, NameError xatoligi chiqarildi hamda qayerda shu xatolik qayd qilingani ham ko’rsatildi. Bu holda xatoliklarni qayta ishlovchisi harakatga tushadi.

Exception’lar

Foydalanuvchidan nimadir kiritishini so’raymiz, so’ngra Ctrl + d tugmalarini bosamiz va nima bo’lishini kuzatamiz.

>>> s = input(“Nimadir kiriting –> “)

Nimadir kiriting –> Traceback (most recent call last):

File “<stdin>”, line 1, in <module>

EOFError

Python EOFError nomli xatolikni chiqardi. Bu xatolik kutilmagan joyda (Ctrl + d tugmalari yordamida kiritiladigan) fayl oxiri (end of file) belgisi qayd qilinganini bildiradi.

Exception – istisnolarni qayta ishlash

Exception’larni try . . except operatori yordamida qayta ishlash mumkin. Bunda hamma odatiy buyruqlar try blokiga joylashtiriladi, istisnolarni qayta ishlovchilari esa except blokiga joylashtiriladi.

Misol: (try_except.py nomi bilan saqlang.)

  1. try:
  2.  
  3. text = input('Nimadir kiriting --> ')
  4.  
  5. except EOFError:
  6.  
  7. print('Nega EOF qildigiz?')
  8.  
  9. except KeyboardInterrupt:
  10.  
  11. print('Siz amallarni bekor qildingiz.')
  12.  
  13. else:
  14.  
  15. print('Siz {0} kiritdingiz.'.format(text))

Natija:

$ python try_except.py

Nimadir kiriting → # Ctrl + d ni bosing

Nega EOF qildingiz?

$ python try_except.py

Nimadir kiriting → # Ctrl + c ni bosing

Siz amallarni bekor qildingiz.

$ python try_except.py

Nimadir kiriting → xatosiz

Siz xatosiz kiritdingiz.

Bu qanday ishlaydi:

Bu yerda biz istisno/xatolik chaqirishi mumkin bo’lgan barcha buyruqlarni try bloki ichiga joylashtirdik. So’ng except bloki ichiga tegishli istisno/xatolikka mos keluvchi qayta ishlovchilarni joylashtirdik. except ifodasi bitta istisno/xatolikni yoki qavs ichida ko’rsatilgan bir nechta istisno/xatoliklarni qayta ishlashi mumkin. Agar xatolik yoki istisno nomi ko’rsatilmagan bo’lsa, u holda barcha xatolik va istisnolar qayta ishlanadi.

Yodingizda saqlang, try ifodasi uchun hech bo’lmaganda bitta except ifodasi bo’lishi kerak. Aks holda try ishlatishning hech qanday ma’nosi qolmaydi.

Agar xatolik yoki istisno biror except blokida ushlab qolinmasa, u holda pythonning istisnolarni qayta ishlovchisi chaqiriladi va oynaga xatolik haqidagi xabarni chop etadi. Yuqorida bunga misol ko’rdik.

try . . except blokiga else blokini ham qo’shish mumkin. Bu blok hech qanday istisno yuz bermaganda ishga tushadi.

Exception – istino chaqirish

Istisnolarni raise operatori yordamida tegishli xatolik/istisno nomini bergan holda chaqirish mumkin.

Misol: (raising.py nomi bilan saqlang)

  1. class ShortInputException(Exception):
  2.  
  3. '''Foydalanuvchi klass exceptioni.'''
  4.  
  5. def __init__(self, length, atleast):
  6.  
  7. Exception.__init__(self)
  8.  
  9. self.length = length
  10.  
  11. self.atleast = atleast
  12.  
  13.  
  14. try:
  15.  
  16. text = input("Nimadir kiriting --> ")
  17.  
  18. if len(text) < 3:
  19.  
  20. raise ShortInputException(len(text), 3)
  21.  
  22. # Bu yerda kerakli amallar bajarilishi mumkin.
  23.  
  24. except EOFError:
  25.  
  26. print("Nega EOF qildingiz?")
  27.  
  28. except ShortInputException as ex:
  29.  
  30. print("ShortInputException: Kiritilgan satr uzunligi -- {0}; minimum {1} kutilgan edi".format(ex.length, ex.atleast))
  31.  
  32. else:
  33.  
  34. print("Exception bo'lmadi.")

Natija:

$ python raising.py

Nimadir kiriting –> a

ShortInputException: Kiritilgan satr uzunligi — 1; minimum 3 uzunlik kutilgan edi

Bu qanday ishlaydi:

Bu yerda biz ShortInputException nomli o’zimizning exception turimizni xosil qildik. U ikkita xususiyatdan (maydon) tashkil topgan: length — kiritilgan satr uzunligini saqlash uchun, atleast — dastur kutgan minimal satr uzunligi.

except blokida biz ShortInputException klasini ko’rsatamiz u o’z navbatida ex o’zgaruvchisiga saqlanadi. ex o’zgaruvchisi esa tegishlik xatolik/exception ob’yektidan tashkil topgan. except bloki ichida length va atleast xususiyatlarini ishlatib foydalanuvchiga tegishli xabarni ko’rsatamiz.

try . . finally

Tasavvur qilaylik, dasturda fayldan o’qib olish amali bor va dastur oxirida shu fayl to’g’ri yopilishi kerak. Bunga finally blokini qo’llash bilan erishish mumkin.

Misol: (finally.py nomi bilan saqlang)

  1. import time
  2.  
  3. try:
  4.  
  5. f = open('poem.txt')
  6.  
  7. while True: # Odatiy fayldan o'qish usuli
  8.  
  9. line = f.readline()
  10.  
  11. if len(line) == 0:
  12.  
  13. break
  14.  
  15. print(line, end='')
  16.  
  17. time.sleep(2) # Bir qancha vaqt kutish
  18.  
  19. except KeyboardInterrupt:
  20.  
  21. print("!! Siz fayldan o'qishni bekor qildingiz.")
  22.  
  23. finally:
  24.  
  25. f.close()
  26.  
  27. print('(Tozalash: Faylni yopish)')

Natija:

$ python finally.py

Dasturlash qiziqarli.

Agar ish zerikarli bo’lsa,

Unga quvnoq tus berish uchun –

^C!! Siz fayldan o’qishni bekor qildingiz.

(Tozalash: Faylni yopish)

Bu qanday ishlaydi:

Bu yerda biz oddiy fayldan o’qib olish amallarini bajaryapmiz. Dastur sekin ishlashi uchun har bir chop qilingan satrdan so’ng dastur 2 sekund uyquga ketadi (python judayam tez ishlaydi). Dasturni to’xtatish yoki bekor qilish uchun dastur bajarilishi jarayonida Ctrl + c bosing.

Kuzatgan bo’lsangiz KeyboardInterrupt istisnosi yuz berdi va dastur bajarilishdan to’xtadi. Ammo dastur bajarilishdan to’xtashidan oldin finally bloki bajarildi va o’qish uchun ochilgan fayl yopildi.

with operatori

Biror bir resursga try blokida murojaat qilib, so’ngra bu resursni finally blokida bo’shatib yuborish odatiy yo’l sifatida ko’riladi. Lekin bu amalni nisbatan qulayroq bajarish uchun with operatoridan foydalanish mumkin. 

Misol: (using_with.py nomi bilan saqlang)

  1. with open("poem.txt") as f:
  2.  
  3. for line in f:
  4.  
  5. print(line, end='')

Natija:

$ python using_with.py

Dasturlash qiziqarli.

Agar ish zerikarli bo’lsa,

Unga quvnoq tus berish uchun –

Pythonni ishlating!

Bu qanday ishlaydi:

Natija bundan oldingi misoldagi kabi bo’lishi kerak. Farqi shundaki, biz bu yerda open funksiyasini with operatori bilan ishlatyapmiz va shu bilan faylni avtomat yopishni with operatori zimmasiga yuklayapmiz.

poem.txt fayli teksti.

Dasturlash qiziqarli.

Agar ish zerikarli bo’lsa,

Unga quvnoq tus berish uchun –

Pythonni ishlating!

(450 marta o'qilgan, bugun 2 marta o'qildi)

O'xshash maqolalar: