Python'da ichki istisnolar qanday ishlaydi?
sobes.tech AI
AIdan javob
Ichki tashlangan xatoliklar, shuningdek, xatoliklarni zanjirlash deb ham ataladi, yangi xatolik yuzaga kelganda avvalgi xatolik haqida ma'lumotlarni saqlash imkonini beradi. Bu xatoliklarni tuzatish va sabablarini tushunishda foydalidir.
Python 3 da, odatda, except yoki finally bloklari ichida yangi xatolik yuzaga kelganda, asl xatolik avtomatik ravishda yangi bilan bog‘lanadi.
Ushbu bog‘lanish __cause__ atributida saqlanadi.
Aniq bog‘lanishni raise from kalit so‘zi yordamida amalga oshirish mumkin.
# Avtomatik bog‘lanish misoli
def divide(a, b):
try:
return a / b
except TypeError:
# TypeError bilan ishlash davomida boshqa xatolik yuzaga kelishi mumkin
# Asl xatolik (TypeError) yangi bilan bog‘lanadi
raise ValueError("Operatsion turlar noto‘g‘ri")
try:
divide("a", 0)
except ValueError as e:
# e.__cause__ TypeError ni o‘z ichiga oladi
print(f"Xato: {e}")
if e.__cause__:
print(f"Sababi: {e.__cause__}")
print("-" * 20)
# Aniq bog‘lanish misoli raise from bilan
class CustomError(Exception):
pass
def tricky_function():
try:
# Nolga bo‘lishga urinish, ZeroDivisionError ni chaqiradi
result = 1 / 0
except ZeroDivisionError as original_exc:
# Yangi xatolik yaratish va uni asl bilan bog‘lash
raise CustomError("Hisoblashda xato") from original_exc
try:
tricky_function()
except CustomError as e:
# e.__cause__ ZeroDivisionError ni o‘z ichiga oladi
print(f"Xato: {e}")
if e.__cause__:
print(f"Sababi: {e.__cause__}")
print("-" * 20)
# raise ... from None bilan bog‘lanishni to‘xtatish
try:
try:
# Asl xatolik
raise ValueError("Asl xato")
except ValueError:
# ValueError bilan ishlash davomida boshqa xatolik yuzaga keladi,
# lekin bog‘lanish to‘xtatiladi
raise TypeError("Yangi xato") from None
except TypeError as e:
# e.__cause__ bu yerda None bo‘ladi
print(f"Xato: {e}")
if e.__cause__ is None:
print("Sababi ko‘rsatilmagan.")
raise kalit so‘zi argumentlarsiz ishlatilganda, oxirgi yuzaga kelgan xatolikni qayta ko‘targan bo‘ladi.
# Xatolikni qayta ko‘targan misol
def process_data(data):
try:
# Bu yerda nimadir noto‘g‘ri bo‘lishi mumkin
if not data:
raise ValueError("Ma'lumotlar yo‘q")
print("Ma'lumotlar ishlov berildi")
except ValueError:
print("ValueError ni ushladik")
# Xatolikni qayta ko‘taramiz
raise
try:
process_data("")
except ValueError as e:
print(f"Qayta ko‘targan xatolik: {e}")
Ichki xatoliklar xatoliklarning izlanishlarini o‘qilishi yaxshilaydi va muammo asosiy sababini tezroq aniqlashga yordam beradi.