Python'da Özel İstisnalar Nasıl Tanımlanır? (Örneklerle)

Bu eğitimde, örnekler yardımıyla gereksinimlerinize bağlı olarak özel istisnaları nasıl tanımlayacağınızı öğreneceksiniz.

Python, programdaki bir şeyler ters gittiğinde programınızı bir hata vermeye zorlayan çok sayıda yerleşik istisnaya sahiptir.

Ancak bazen amacınıza hizmet eden kendi özel istisnalarınızı oluşturmanız gerekebilir.

Özel İstisnalar Oluşturma

Python'da, kullanıcılar yeni bir sınıf oluşturarak özel istisnalar tanımlayabilir. Bu istisna sınıfı, doğrudan veya dolaylı olarak yerleşik Exceptionsınıftan türetilmelidir . Yerleşik istisnaların çoğu da bu sınıftan türetilmiştir.

 >>> class CustomError(Exception):… pass… >>> raise CustomError Traceback (most recent call last):… __main__.CustomError >>> raise CustomError("An error occurred") Traceback (most recent call last):… __main__.CustomError: An error occurred

Burada, sınıftan CustomErrormiras alan kullanıcı tanımlı bir istisna oluşturduk Exception. Bu yeni istisna, diğer istisnalar gibi, raiseisteğe bağlı bir hata mesajı içeren ifade kullanılarak ortaya çıkarılabilir .

Büyük bir Python programı geliştirirken, programımızın ortaya çıkardığı tüm kullanıcı tanımlı istisnaları ayrı bir dosyaya yerleştirmek iyi bir uygulamadır. Birçok standart modül bunu yapar. İstisnalarını ayrı ayrı exceptions.pyveya olarak tanımlarlar errors.py(genellikle ama her zaman değil).

Kullanıcı tanımlı istisna sınıfı, normal bir sınıfın yapabileceği her şeyi uygulayabilir, ancak genellikle onları basit ve öz hale getiririz. Çoğu uygulama özel bir temel sınıf bildirir ve bu temel sınıftan diğer istisna sınıflarını türetir. Bu kavram aşağıdaki örnekte daha açık hale getirilmiştir.

Örnek: Python'da Kullanıcı Tanımlı İstisna

Bu örnekte, kullanıcı tanımlı istisnaların bir programda hataları yükseltmek ve yakalamak için nasıl kullanılabileceğini göstereceğiz.

Bu program, kullanıcıdan kayıtlı bir sayıyı doğru tahmin edene kadar bir sayı girmesini isteyecektir. Bunu anlamalarına yardımcı olmak için, tahminlerinin saklanan sayıdan büyük veya küçük olup olmadığı konusunda bir ipucu verilir.

 # define Python user-defined exceptions class Error(Exception): """Base class for other exceptions""" pass class ValueTooSmallError(Error): """Raised when the input value is too small""" pass class ValueTooLargeError(Error): """Raised when the input value is too large""" pass # you need to guess this number number = 10 # user guesses a number until he/she gets it right while True: try: i_num = int(input("Enter a number: ")) if i_num number: raise ValueTooLargeError break except ValueTooSmallError: print("This value is too small, try again!") print() except ValueTooLargeError: print("This value is too large, try again!") print() print("Congratulations! You guessed it correctly.")

İşte bu programın örnek bir çalışması.

Bir sayı girin: 12 Bu değer çok büyük, tekrar deneyin! Bir sayı girin: 0 Bu değer çok küçük, tekrar deneyin! Bir sayı girin: 8 Bu değer çok küçük, tekrar deneyin! Bir sayı girin: 10 Tebrikler! Doğru tahmin ettin.

Adlı bir temel sınıf tanımladık Error.

Programımız tarafından ortaya atılan diğer iki istisna ( ValueTooSmallErrorve ValueTooLargeError) bu sınıftan türetilmiştir. Bu, Python programlamada kullanıcı tanımlı istisnaları tanımlamanın standart yoludur, ancak yalnızca bu yolla sınırlı değilsiniz.

İstisna Sınıflarını Özelleştirme

İhtiyaçlarımıza göre diğer argümanları kabul etmek için bu sınıfı daha da özelleştirebiliriz.

İstisna sınıflarını özelleştirme hakkında bilgi edinmek için Nesne Yönelimli programlama konusunda temel bilgiye sahip olmanız gerekir.

Python'da Nesne Tabanlı programlama hakkında bilgi edinmeye başlamak için Python Nesne Tabanlı Programlama'yı ziyaret edin.

Bir örneğe bakalım:

 class SalaryNotInRangeError(Exception): """Exception raised for errors in the input salary. Attributes: salary -- input salary which caused the error message -- explanation of the error """ def __init__(self, salary, message="Salary is not in (5000, 15000) range"): self.salary = salary self.message = message super().__init__(self.message) salary = int(input("Enter salary amount: ")) if not 5000 < salary < 15000: raise SalaryNotInRangeError(salary)

Çıktı

 Maaş tutarını girin: 2000 Traceback (en son çağrı): SalaryNotInRangeError (maaş) artışında Dosya "", satır 17, __main __. SalaryNotInRangeError: Maaş (5000, 15000) aralığında değil

Burada, Exceptionkendi özel argümanlarımızı kabul etmesi için sınıfın yapıcısını geçersiz kıldık salaryve message. Daha sonra, ebeveyn Exceptionsınıfının yapıcısı , self.messageargüman kullanılarak manuel olarak çağrılır super().

Özel self.salarynitelik daha sonra kullanılmak üzere tanımlanır.

Sınıfın miras alınan __str__yöntemi Exceptiondaha sonra SalaryNotInRangeErroryükseltildiğinde karşılık gelen mesajı görüntülemek için kullanılır .

__str__Yöntemin kendisini geçersiz kılarak da özelleştirebiliriz .

 class SalaryNotInRangeError(Exception): """Exception raised for errors in the input salary. Attributes: salary -- input salary which caused the error message -- explanation of the error """ def __init__(self, salary, message="Salary is not in (5000, 15000) range"): self.salary = salary self.message = message super().__init__(self.message) def __str__(self): return f'(self.salary) -> (self.message)' salary = int(input("Enter salary amount: ")) if not 5000 < salary < 15000: raise SalaryNotInRangeError(salary)

Çıktı

 Maaş tutarını girin: 2000 Traceback (en son çağrı): Dosya "/home/bsoyuj/Desktop/Untitled-1.py", satır 20, zam SalaryNotInRangeError (maaş) __main __. SalaryNotInRangeError: 2000 -> Maaş şu anda değil ( 5000, 15000) aralığı

Python'da istisnaları nasıl idare edebileceğiniz hakkında daha fazla bilgi edinmek için Python Özel Durum İşleme sayfasını ziyaret edin.

Ilginç makaleler...