CodeGym /Kurslar /Python SELF AZ /Öz istisnanı yaratmaq

Öz istisnanı yaratmaq

Python SELF AZ
Səviyyə , Dərs
Mövcuddur

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.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION