Exceptions/Istisnolar
Exceptions/Istisnolar
Xatoliklar ikki xil bo’ladi: sintaktik va logik.
Sintaktik xatoda interpretator dasturni ishga tushirishga to’xtab qoladi, davom eta olmaydi, dasturda yozilgan jumlaga tushunmaydi.
Logik xatolarda kiritilgan ma’lumot natijasida yoki hisoblash natijasida yuzaga kelishi mumkin. Bunda ma’lumot qabul qilinish chegarasidan chiqib qolishi natijasida yuzaga keladi.
Logik xatolarda dasturning ishlashini ta’minlash maqsadida istisnolar kerak bo’ladi.
Exceptions/Istisnolar
Python da uchraydigan logik xatolar haqida:
Agar e’lon qilinmagan o’zgaruvchini ishlatsak:
>>>print(yangi_qiymat)
NameError: name 'yangi_qiymat' is not defined
Chunki yangi_qiymat degan o’zgaruvchini oldin e’lon qilib olishimiz kerak. Aks holda NameError tipidagi xatolik chiqadi
Exceptions/Istisnolar
Python da uchraydigan logik xatolar haqida:
Sonni nolga bo’lish amali yuz berganda:
>>> 1/0
Traceback (innermost last):
File "", line 1, in ?
ZeroDivisionError: integer division or modulo by zero
Bu holatda ZeroDivisionError tipidagi xatolik yuz beradi.
Exceptions/Istisnolar
Python da uchraydigan logik xatolar haqida:
Indekslar chegarasidan chiqib ketsak:
>>> aList = [ ]
>>> aList[0]
Traceback (innermost last):
File "", line 1, in ?
IndexError: list index out of range
aList listida nolinchi indeksdagi elementi yo’q. Shuning uchun IndexError turidagi xatolik chiqdi.
Exceptions/Istisnolar
Python da uchraydigan logik xatolar haqida:
Lug’at (dictionary) da mavjud bo’lmagan kalit (key) ga murojaat qilinganda:
>>> aDict = {'host': 'earth', 'port': 80}
>>> print aDict['server']
Traceback (innermost last):
File "", line 1, in ?
KeyError: server
Chunki aDict lug’atda ‘server’ degan kalit (key) yo’q.
Exceptions/Istisnolar
Python da uchraydigan logik xatolar haqida:
Mavjud bo’lmagan faylni ochmoqchi bo’lsak:
>>> f = open("qanaqadir_fayl")
Traceback (innermost last):
File "", line 1, in ?
IOError: [Errno 2] No such file or directory: 'qanaqadir_fayl’
Bunda IOError (Input Output Error – kirirtish chiqarish xatoligi) yuz berdi.
Exceptions/Istisnolar
Python da uchraydigan logik xatolar haqida:
>>> class myClass(object):
...
pass
...
>>> namuna = myClass()
>>> namuna.bar = 'spam'
>>> namuna.bar
'spam'
>>> namuna.foo
Traceback (innermost last):
File "", line 1, in ?
AttributeError: foo #Chunki namuna obyektida foo degan attribut yo’q.
Exceptions/Istisnolar
Try-except metodi
Bu usulda dastur kodiga biror istisnoni kiritish uchun ishlatiladi. Uning sintaksisini umumiy ko’rinishi quyidagicha:
try:
asosiy_dastur
except Exception:
istisno_qism
Exceptions/Istisnolar
Try-except metodi
Misol:
def float_misol(qiymat):
try:
return float(qiymat)
except ValueError:
pass
Bu funksiya argumentida kelgan qiymatni float tipiga o’zgartiradi. Agar argumentda son emas, string tipidagi yoki boshqa o’tkazib bo’lmaydigan tip kelsa, ya’ni ValueError tipidagi xatolik hosil bo’lishini mabodo oldindan bilsak, u holda pass operatori ishga tushadi – ya’ni hech narsa qilmaydi. Jim turadi.
Exceptions/Istisnolar
Try-except metodi
Yoqiradagi misol yana quyidagicha talqin qilish mumkin:
def safe_float(obj):
try:
qiymat = float(obj)
except ValueError:
qiymat = None
return qiymat
Exceptions/Istisnolar
Try-except metodi
Yoki bo’lmasa:
def safe_float(obj):
try:
qiymat = float(obj)
except ValueError:
qiymat = 'float tipiga almashtirish mumkin emas'
return qiymat
Shu oxirgi misolni keyingi slaydda ishlatib ko’ramiz:
Exceptions/Istisnolar
Try-except metodi
def safe_float(obj):
try:
qiymat = float(obj)
except ValueError:
qiymat = 'float tipiga almashtirish mumkin emas'
return qiymat
print(safe_float(“4”))
print(safe_float(4))
print(safe_float("qanaqadir_ifoda"))
4.0
4.0
float tipiga almashtirish mumkin emas
Exceptions/Istisnolar
Try-except metodi
Endi quyidagi dasturga qaraylik:
def safe_float(obj):
try:
qiymat = float(obj)
except ValueError:
qiymat = 'float tipiga almashtirish mumkin emas'
return qiymat
print(safe_float({"model":"nexia"}))
TypeError: float() argument must be a string or a number, not 'dict'
Bu holatda ishlamadi. Chunki argumentga dictionary tipidagi ifoda kelayapti. Bu esa ValueError ni emas TypeError ni beradi. Ya’ni argumentdagi qiymat emas, argumentdagi tip (yoki tur) xato berilayapti. Shuning uchun biz kutgan ‘float tipiga almashtirish mumkin emas’ jumla chiqmadi. Shu jumla chiqishi uchun dastur kodiga ValueError degan yozuvni o’rniga TypeError deb yozib qo’yishmiz kerak. Lekin bu holda esa faqat TypeError tipidagi xatolik uchun ishlaydigan bo’lib qoladi. Ham u uchun, ham bu uchun ishlaydigan bo’lishi uchun nima qilishimiz kerak?
Exceptions/Istisnolar
Try-except metodi
def safe_float(obj):
try:
qiymat = float(obj)
except ValueError:
qiymat = 'float tipiga almashtirish mumkin emas'
except TypeError:
qiymat = 'float tipiga almashtirish mumkin emas'
return qiymat
print(safe_float("4"))
print(safe_float(4))
print(safe_float("qanaqadir_ifoda"))
print(safe_float({"model":"nexia"}))
Javob:
4.0
4.0
float tipiga almashtirish mumkin emas
float tipiga almashtirish mumkin emas
Exceptions/Istisnolar
Try-except metodi
Yoki quyidagicha ham yozish mumkin:
def safe_float(obj):
try:
qiymat = float(obj)
except (ValueError, TypeError):
qiymat = 'float tipiga almashtirish mumkin emas'
return qiymat
print(safe_float("4"))
print(safe_float(4))
print(safe_float("qanaqadir_ifoda"))
print(safe_float({"model":"nexia"}))
Javob:
4.0
4.0
float tipiga almashtirish mumkin emas
float tipiga almashtirish mumkin emas
Exceptions/Istisnolar
Try-except-else metodi
Bu metodda avval try qismi bajariladi. Agar biror istisno hosil bo’lsa, except qismi bajarilib, dastur tugaydi. Agar istisno bo’lmasa, try qismidan keyingi qadamlar else qismida bajariladi. Misol uchun:
try:
a = input("Birinchi sonni kiriting: ")
b = input("Ikkinchi sonni kiriting: ")
result = int(a)/int(b)
except (ValueError, ZeroDivisionError):
print("Xatolik yuz berdi!")
else:
print("Bu sonlarning nisbatini kvadrati: ", result**2)
Birinchi sonni kiriting: 7
Ikkinchi sonni kiriting: 3
Bu sonlarning nisbatini kvadrati: 5.4444444444444455
Birinchi sonni kiriting: a
Ikkinchi sonni kiriting: 1
Xatolik yuz berdi!
Exceptions/Istisnolar
Try-(except-else)-finally metodi
Bu metodda avval try qismi bajariladi. Agar except yoki else qismlari bo’lsa, ular ham vaziyatga qarab bajariladi. Shundan so’ng hamma qism o’z ishini bajarib olganidan so’ng finally qismi o’z ishini bajaradi. Shuni aytish kerakki, except va else qismlar ishlatilmasligi ham mumkin. Misol uchun:
try:
a = input("Birinchi sonni kiriting: ")
b = input("Ikkinchi sonni kiriting: ")
result = int(a)/int(b)
except (ValueError, ZeroDivisionError):
print("Xatolik yuz berdi!")
else:
print("Bu sonlarning nisbatini kvadrati: ", result**2)
finally:
print("Dastur o'z ishini yakunladi.")
Birinchi sonni kiriting: 2
Ikkinchi sonni kiriting: 3
Bu sonlarning nisbatini kvadrati: 0.4444444444444444
Dastur o'z ishini yakunladi.
Birinchi sonni kiriting: a
Ikkinchi sonni kiriting: 1
Xatolik yuz berdi!
Dastur o'z ishini yakunladi.
Exceptions/Istisnolar
Try-(except-else)-finally metodi
Bu metodda avval try qismi bajariladi. Agar except yoki else qismlari bo’lsa, ular ham vaziyatga qarab bajariladi. Shundan so’ng hamma qism o’z ishini bajarib olganidan so’ng finally qismi o’z ishini bajaradi. Shuni aytish kerakki, except va else qismlar ishlatilmasligi ham mumkin. Misol uchun:
try:
a = input("Birinchi sonni kiriting: ")
b = input("Ikkinchi sonni kiriting: ")
result = int(a)/int(b)
except (ValueError, ZeroDivisionError):
print("Xatolik yuz berdi!")
else:
print("Bu sonlarning nisbatini kvadrati: ", result**2)
finally:
print("Dastur o'z ishini yakunladi.")
Birinchi sonni kiriting: 2
Ikkinchi sonni kiriting: 3
Bu sonlarning nisbatini kvadrati: 0.4444444444444444
Dastur o'z ishini yakunladi.
Birinchi sonni kiriting: a
Ikkinchi sonni kiriting: 1
Xatolik yuz berdi!
Dastur o'z ishini yakunladi.
Exceptions/Istisnolar
BaseException
Qisqacharoq variant ham bor. Misol uchun:
try:
a=input("enter: ")
b=1/int(a)
print(b)
except BaseException:
print("xato")
Bu holatda aniq qanaqa istisno bo’lishi aytilmagan. Shunday bo’lsada har qanday istisno holat uchun ishlayveradi.
Exceptions/Istisnolar
BaseException
Umuman Python dagi barcha turdagi istisnolarning har birini alohida bir sinflar deb qaraladi. Bir sinf boshqa bir sinf uchun voris bo’lishi mumkinligi bilgan holda, BaseException istisnosi barcha istisno sinflar uchun asosiy (baza, parent yoki eng dastlabki ota sinf) sinf deb qaraladi. Qolgan sinflar shu sinfning voris (child) sinfi bo’lib xizmat qiladi. BaseException sinfini uchta voris sinfi bor. Ular SystemExit, KeyboardInterrupt, Exception. SystemExit, KeyboardInterrupt sinflarning vorislar yo’q. Qolgan barcha istisnolar Exception istisno sinfini vorislari hisoblanadi. Shuning uchun Exception sinfidagi biror istisno bilan ishlamoqchi bo’lsak, yo o’sha istisnoni o’zini, yoki Exception ni o’zini ishlatsak ham bo’ladi. Lekin adabiyotlarda bunday qilish tavsiya qilinmaydi. Qaysi istisno bo’lsa, aynan o’sha bilan ishlagan ma’qul deyiladi. Istisnolar sinfini qo’yidagi jadvaldan ko’rishimiz mumkin:
Exceptions/Istisnolar
Istisno sinflar jadvali
Bundan tashqari yana 30 dan ortiq istisno holatlar mavjud. Topshiriq: internetdan qidirib, organib 15ta istisno holat uchun misol tuzilsin.
BaseException
| | |
Barcha istisno sinflar uchun asosiy sinf
| |
SystemExit
| |
Python interpretatori ish jarayonidan chiqib ketmoqchi bo’lsa
| |
KeyboardInterrupt
| |
Python dasturidan foydalanuvchi tomonidan chiqib ketishni talab qilganda
| |
Exception
| |
Regular istisnolar uchun asosiy sinf
| | |
StopIteration, GeneratorExit, SystemExit, StandardError, ArithmeticError, FloatingPointError, OverflowError, ZeroDivisionError
| |
Do'stlaringiz bilan baham: |