7.1 İstifadəçi üçün xüsusi istisnalar yaratmaq
Bəzən Python-un standart istisnaları sizin tətbiqiniz üçün tam uyğun gəlmir. Belə hallarda, siz bazadan olan Exception
və ya hər hansı digər uyğun istisna sinifindən törədərək öz xüsusi istisnalarınızı yarada bilərsiniz.
Xüsusi istisnalar yaratmağın əsasları
İstifadəçi üçün xüsusi istisna yaratmaq yeni bir sinifin müəyyən edilməsini əhatə edir. Bu sinif Exception
bazasından törədilir. Siz öz sinifinizə əlavə metodlar və atributlar əlavə edə bilərsiniz ki, bu da xəta haqqında əlavə məlumat təmin edəcək.
Sadə xüsusi istisnanın yaradılmasına nümunə
Adım 1: Xüsusi istisnanın müəyyən edilməsi
class MyCustomError(Exception):
"""Xüsusi istisnalar üçün sinif."""
pass
Adım 2: Xüsusi istisnanın istifadəsi
def check_value(value):
if value < 0:
raise MyCustomError("Dəyər sıfırdan kiçik olmamalıdır")
try:
check_value(-1)
except MyCustomError as e:
print(f"Xüsusi istisna baş verdi: {e}")
Hər şey çox sadədir. Əsas odur ki, sizin istisna Exception
sinifindən və ya onun törəmələrindən biri əsasında olmalıdır.
7.2 Əlavə atributları olan istisnanın yaradılması
Klassınıza atributlar və metodlar əlavə edib səhv haqqında əlavə məlumatlar ötürə bilərsiniz.
Misal:
class NegativeValueError( Exception ):
"""Mənfi qiymət zamanı istifadəçi üçün istisna klassı."""
def __init__(self, value, message = "Qiymət sıfırdan az olmamalıdır"):
self.value = value
self.message = message
super().__init__(self.message)
def __str__(self):
return f'{self.message}: {self.value}'
Əlavə atributları olan istisnadan istifadə
def check_value(value):
if value < 0:
raise NegativeValueError(value)
try:
check_value(-1)
except NegativeValueError as e:
print(f"İstifadəçi istisnası baş verdi: {e}")
Bizim istisna — bu, Exception
klassından irs alan bir klassdır. Ona görə də onunla digər klasslar kimi hər şey etmək mümkündür: sahələr, metodlar, konstruktor parametrləri və s. əlavə etmək.
Bütün bunlar sizin rahatlığınız və sizin istisnalarınızı tutacaq proqramçıların rahatlığı üçün edilir.
7.3 İstifadəçi İstisnaları Üçün İerarxiya Yaratmaq
Daha mürəkkəb tətbiqlər üçün istifadəçi istisnaları üçün ierarxiya yaratmaq faydalıdır. Bu, əlaqəli istisnaları qruplaşdırmağa və onların işlənməsini asanlaşdırmağa imkan verir.
Nümunə:
class ApplicationError(Exception):
"""Tətbiqin bütün istisnaları üçün əsas sinif."""
pass
class NegativeValueError(ApplicationError):
"""Mənfi dəyər halında istifadəçi istisnası sinifi."""
def __init__(self, value, message="Dəyər sıfırdan kiçik olmamalıdır"):
self.value = value
self.message = message
super().__init__(self.message)
def __str__(self):
return f'{self.message}: {self.value}'
class ValueTooLargeError(ApplicationError):
"""Çox böyük dəyər halında istifadəçi istisnası sinifi."""
def __init__(self, value, message="Dəyər çox böyükdür"):
self.value = value
self.message = message
super().__init__(self.message)
def __str__(self):
return f'{self.message}: {self.value}'
İstifadəçi istisnalarının ierarxiyasından istifadə
def check_value(value):
if value < 0:
raise NegativeValueError(value)
elif value > 100:
raise ValueTooLargeError(value)
try:
check_value(150)
except NegativeValueError as e:
print(f"İstisna baş verdi: {e}")
except ValueTooLargeError as e:
print(f"İstisna baş verdi: {e}")
except ApplicationError as e:
print(f"Ümumi tətbiq istisnası: {e}")
7.4 İstisnaların tutma ardıcıllığı
İstisnaları tutarkən, xüsusən də eyni iyerarxiyada olanları, düzgün ardıcıllığı göstərmək vacibdir. Və bu zaman except
bloklarının içindəki kod heç vaxt eyni anda bir neçə yerdə icra olunmur, amma məsələ burasındadır ki, əsas istisna sinfi, bütün törəmə siniflərin istisnalarını tuta bilir.
Məsələn, aşağıdakı kod:
def check_value(value):
if value < 0:
raise NegativeValueError(value)
elif value > 100:
raise ValueTooLargeError(value)
try:
check_value(150)
except ApplicationError as e: # ApplicationError və onun bütün törəmə siniflərinin istisnalarını tutacaq
print(f"Ümumi tətbiq istisnası: {e}")
except
blokunda ApplicationError
növündən olan istisnalar və onun bütün siniflərin törəmələri tutulacaq.
Və bütün istisnalar Exception
sinfinin törəmələri olduğuna görə, belə bir kod istənilən istisnanı tuta bilər:
def check_value(value):
if value < 0:
raise NegativeValueError(value)
elif value > 100:
raise ValueTooLargeError(value)
try:
check_value(150)
except Exception as e:
print(f"Bütün istisnaların tutulması: {e}")
except ApplicationError as e: # Bu kod heç vaxt icra olunmayacaq
print(f"Ümumi tətbiq istisnası: {e}")
except ApplicationError
blokunda istisnalar heç vaxt tutulmayacaq, çünki except Exception
bloku ümumilikdə bütün Exception
növündən olan istisnaları və onun törəmələrini tutacaq.
Həll
Buna görə istisnaları tutmaq irsiyyətə əks qaydada qəbul edilib: Exception
sinfinə nə qədər yaxınsa, o, daha aşağıda yerləşir.
Nümunə:
def check_value(value):
if value < 0:
raise NegativeValueError(value)
elif value > 100:
raise ValueTooLargeError(value)
try:
check_value(150)
except NegativeValueError as e:
print(f"Baş verdi: {e}")
except ApplicationError as e:
print(f"Ümumi tətbiq istisnası: {e}")
except Exception as e:
print(f"Bütün istisnaların tutulması: {e}")
Bu nümunədə except
blokları irsiyyət iyerarxiyasına uyğun sıralanmışdır: əvvəlcə daha spesifik istisnalar tutulur, məsələn NegativeValueError
, daha sonra daha ümumi olanlar, məsələn ApplicationError
. Bu, istisnaların düzgün işlənməsinə şərait yaradır və daha ümumi bir emalçının daha spesifik except
bloklarının işləməsindən öncə istisnanı tutduğu vəziyyətlərin qarşısını alır.
GO TO FULL VERSION