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 Exception
sı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 CustomError
miras alan kullanıcı tanımlı bir istisna oluşturduk Exception
. Bu yeni istisna, diğer istisnalar gibi, raise
isteğ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.py
veya 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 ( ValueTooSmallError
ve 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, Exception
kendi özel argümanlarımızı kabul etmesi için sınıfın yapıcısını geçersiz kıldık salary
ve message
. Daha sonra, ebeveyn Exception
sınıfının yapıcısı , self.message
argüman kullanılarak manuel olarak çağrılır super()
.
Özel self.salary
nitelik daha sonra kullanılmak üzere tanımlanır.
Sınıfın miras alınan __str__
yöntemi Exception
daha sonra SalaryNotInRangeError
yü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.