Python Kullanıcı Tanımlı İstisnalar
Bu eğitimde, örneklerin yardımıyla gereksinimlerinize bağlı olarak özel istisnaları nasıl tanımlayacağınızı öğreneceksiniz.
Python, programda 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ı, yerleşik Exception
sınıftan doğrudan veya dolaylı olarak türetilmelidir. Yerleşik istisnaların çoğu da bu sınıftan türetilmiştir.
1 2 3 4 5 6 7 8 9 10 11 12 13 | >>> 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 CustomError
miras alan bir kullanıcı tanımlı istisna oluşturduk . Exception
Bu yeni istisna, diğer istisnalar gibi, raise
isteğe bağlı bir hata mesajı içeren ifade kullanılarak oluşturulabilir.
Büyük bir Python programı geliştirirken, programımızın oluşturduğu 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.py
veya errors.py
(genellikle ama her zaman değil) olarak tanımlarlar.
Kullanıcı tanımlı istisna sınıfı, normal bir sınıfın yapabileceği her şeyi uygulayabilir, ancak genellikle onları basit ve özlü yaparız. Çoğu uygulama özel bir temel sınıf bildirir ve bu temel sınıftan başka istisna sınıfları türetir. Bu kavram aşağıdaki örnekte daha açık hale getirilmiştir.
Örnek: Python’da Kullanıcı Tanımlı İstisna
Bu örnekte, bir programda hataları oluşturmak ve yakalamak için kullanıcı tanımlı istisnaların nasıl kullanılabileceğini göstereceğiz.
Bu program, kullanıcıdan saklanan bir sayıyı doğru tahmin edene kadar bir sayı girmesini isteyecektir. Anlamalarına yardımcı olmak için, tahminlerinin saklanan sayıdan büyük veya küçük olup olmadığına dair bir ipucu verilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | # 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 ValueTooSmallError elif 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 bir örnek çalışması.
1 2 3 4 5 6 7 8 9 10 11 | <samp>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.</samp> |
adında bir temel sınıf tanımladık Error
.
Programımız tarafından gerçekten ortaya çıkarılan diğer iki istisna ( ValueTooSmallError
ve ValueTooLargeError
) bu sınıftan türetilmiştir. Python programlamasında kullanıcı tanımlı istisnaları tanımlamanın standart yolu budur, ancak sadece 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 Nesneye Dayalı programlama hakkında temel bilgilere sahip olmanız gerekir.
Python’da Nesne Yönelimli programlama hakkında öğrenmeye başlamak için Python Nesne Yönelimli Programlama’yı ziyaret edin .
Bir örneğe bakalım:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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ı
1 2 3 4 5 | <samp>Maaş miktarını girin: 2000 Geri izleme (en son arama son): Dosya "<string>", satır 17, <module> içinde SalaryNotInRangeError(maaş) yükseltmek __main__.SalaryNotInRangeError: Maaş (5000, 15000) aralığında değil</samp> |
Burada, Exception
kendi özel argümanlarımızı salary
ve message
. Ardından, üst sınıfın yapıcısı , argüman kullanılarak Exception
manuel olarak çağrılır .self.message
super()
Özel self.salary
öznitelik daha sonra kullanılmak üzere tanımlanır.
Sınıfın kalıtsal __str__
yöntemi , yükseltildiğinde Exception
ilgili mesajı görüntülemek için kullanılır .SalaryNotInRangeError
__str__
Ayrıca geçersiz kılarak yöntemin kendisini de özelleştirebiliriz .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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ı
1 2 3 4 5 | <samp>Maaş miktarını girin: 2000 Geri izleme (en son arama son): Dosya "/home/bsoyuj/Desktop/Untitled-1.py", satır 20, <module> içinde SalaryNotInRangeError(maaş) yükseltmek __main__.SalaryNotInRangeError: 2000 -> Maaş (5000, 15000) aralığında değil</samp> |
Python’da istisnaları nasıl ele alabileceğiniz hakkında daha fazla bilgi edinmek için Python İstisna İşleme sayfasını ziyaret edin .