Örneklerle Python'da Kullanıcı Tanımlı İstisnalar

Örneklerle Python'da Kullanıcı Tanımlı İstisnalar

Kullanıcı tanımlı istisnalar, miras alan yeni bir sınıf tanımlanarak oluşturulur. Python'un yerleşik İstisnası sınıf veya onun alt sınıflarından biri. Bunu yaparak özel hata mesajları oluşturabilir ve belirli hataları uygulamamız için anlamlı olacak şekilde ele alabiliriz.

Kullanıcı Tanımlı İstisnalar Oluşturma ve Kullanma Adımları

Python'da Kullanıcı Tanımlı İstisnalar oluşturmak ve kullanmak için şu adımları izleyin:

  • Yeni Bir İstisna Sınıfı Tanımlayın: Exception'dan veya onun alt sınıflarından herhangi birinden miras alan yeni bir sınıf oluşturun.
  • İstisnayı Yükselt: Belirli bir koşul oluştuğunda kullanıcı tanımlı istisnayı yükseltmek için Raise deyimini kullanın.
  • İstisnayı ele alın: Kullanıcı tanımlı istisnayı işlemek için try-hariç blokları kullanın.

Örnek: Bu örnekte, yaş değerlerinin geçerli bir aralıkta (0-120) olmasını sağlamak için InvalidAgeError özel bir istisna oluşturuyoruz.

Python
   # Step 1: Define a custom exception class   class   InvalidAgeError  (  Exception  ):   def   __init__  (  self     age     msg  =  'Age must be between 0 and 120'  ):   self  .  age   =   age   self  .  msg   =   msg   super  ()  .  __init__  (  self  .  msg  )   def   __str__  (  self  ):   return   f  '  {  self  .  age  }   ->   {  self  .  msg  }  '   # Step 2: Use the custom exception in your code   def   set_age  (  age  ):   if   age    <   0   or   age   >   120  :   raise   InvalidAgeError  (  age  )   else  :   print  (  f  'Age set to:   {  age  }  '  )   # Step 3: Handling the custom exception   try  :   set_age  (  150  )   # This will raise the custom exception   except   InvalidAgeError   as   e  :   print  (  e  )   

Çıkış
150 -> Age must be between 0 and 120  

Açıklama:

  • InvalidAgeError sınıfı Exception'dan miras alır. Bir tanımlar __sıcak__ yaşı ve mesajı kabul etme yöntemi.
  • __str__ yöntemi, hatanın okunabilir bir dize temsilini döndürür.
  • set_age()'da yaş geçerli aralığın (0-120) dışındaysa istisna ortaya çıkar.
  • Try- Except bloğu istisnayı yakalar ve hata mesajını yazdırır.

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

Özel bir istisna oluşturduğumuzda, Python'un yerleşik Exception sınıfını (veya ValueError TypeError vb. gibi bir alt sınıfı) alt sınıflandırırız. Daha sonra istisnamızı daha bilgilendirici hale getirmek için kendi öznitelik yöntemlerimizi veya özel mantığımızı ekleyebiliriz.

Ayrıca ekstra özellikler ekleyerek veya yöntemleri geçersiz kılarak özel istisnaları da geliştirebiliriz.

Örnek: Burada bir hata kodu ekleyerek ve hata mesajını özelleştirerek InvalidAgeError'ı iyileştiriyoruz.

Python
   class   InvalidAgeError  (  Exception  ):   def   __init__  (  self     age     msg  =  'Age must be between 0 and 120'     error_code  =  1001  ):   self  .  age   =   age   self  .  msg   =   msg   self  .  error_code   =   error_code   super  ()  .  __init__  (  self  .  msg  )   def   __str__  (  self  ):   return   f  '[Error Code   {  self  .  error_code  }  ]   {  self  .  age  }   ->   {  self  .  msg  }  '   try  :   set_age  (  150  )   # This will raise the custom exception   except   InvalidAgeError   as   e  :   print  (  e  )   

Çıkış
[Error Code 1001] 150 -> Age must be between 0 and 120  

Açıklama:

  • InvalidAgeError'ın artık ek bir error_code özelliği var.
  • __str__ yöntemi, hem hata kodunu hem de yaşı görüntülemek için geçersiz kılınır.
  • set_age(150) çalıştırıldığında istisna oluşturulur ve try- Except bloğunda yakalanır.
  • Özelleştirilmiş hata mesajı yazdırılarak hatanın daha açıklayıcı olması sağlanır.

Standart İstisnaları Temel Sınıf Olarak Kullanma

Bazen, doğrudan İstisna'dan miras almak yerine, RuntimeError ValueError vb. gibi standart bir istisnayı alt sınıflandırarak özel bir istisna oluşturabiliriz. Özel istisnanızın belirli bir tür hata olarak değerlendirilmesi gerektiğinde bu kullanışlıdır.

Örnek: Bu örnek, standart bir yerleşik istisna olan RuntimeError'dan devralınarak özel bir NetworkError istisnasının nasıl oluşturulacağını gösterir.

Python
   # NetworkError has base RuntimeError and not Exception   class   NetworkError  (  RuntimeError  ):   def   __init__  (  self     arg  ):   self  .  args   =   (  arg  )   # store as tuple   try  :   raise   NetworkError  (  'Connection failed'  )   except   NetworkError   as   e  :   print  (  e  .  args  )   

Çıkış
('Connection failed')  

Açıklama:

  • NetworkError, yerleşik bir istisna türü olan RuntimeError'dan miras alır.
  • Mesaj yükseltildiğinde args özelliğinde bir tuple olarak saklanır.
  • İstisna yakalanır ve saklanan bağımsız değişkenleri görüntülenir.

Gerçek Dünyadan Örnek: Geçersiz E-posta Hatası

E-posta adresi geçerli değilse özel bir istisna oluşturduğumuz basit bir örneği burada bulabilirsiniz:

Python
   class   InvalidEmailError  (  Exception  ):   def   __init__  (  self     email     msg  =  'Invalid email format'  ):   self  .  email   =   email   self  .  msg   =   msg   super  ()  .  __init__  (  self  .  msg  )   def   __str__  (  self  ):   return   f  '  {  self  .  email  }   ->   {  self  .  msg  }  '   def   set_email  (  email  ):   if   '@'   not   in   email  :   raise   InvalidEmailError  (  email  )   print  (  f  'Email set to:   {  email  }  '  )   try  :   set_email  (  'userexample.com'  )   except   InvalidEmailError   as   e  :   print  (  e  )   

Çıkış
userexample.com -> Invalid email format  

Açıklama:

  • E-posta adreslerini doğrulamak için yeni bir istisna sınıfı InvalidEmailError tanımlanır.
  • Verilen e-posta '@' içermiyorsa bu istisna ortaya çıkar.
  • Try-hariç bloğu hatayı yakalar ve biçimlendirilmiş mesajı yazdırır.

Kullanıcı Tanımlı İstisnalar Ne Zaman Kullanılır?

Kullanıcı tanımlı istisnalar aşağıdaki senaryolarda dikkate alınmalıdır:

  • Bir uygulamadaki belirli hataları temsil etme (örn. InvalidAgeError DatabaseConnectionError).
  • Daha net ve açıklayıcı hata mesajları sağlamak.
  • Bir grup ilgili hatayı, hariç kullanarak ayrı ayrı işlemek.

Kullanıcı tanımlı istisnalar kullanılarak programlar daha okunabilir, bakımı kolay ve hata ayıklaması daha kolay hale gelir.

Önerilen Test Testi Düzenle 3 Soru

Kullanıcı tanımlı bir istisna, Exception yerine RuntimeError'dan devralırsa ne olur?

  • A

    Hariç kullanılarak yakalanamaz

  • B

    Denetlenmeyen bir istisna haline gelir

  • C

    İşleyiciler tarafından çalışma zamanı ile ilgili bir hata olarak değerlendirilir

  • D

    Özel nitelikleri kaybeder

Açıklama:

RuntimeError'dan devralınması, bunun hem özel bir çalışma zamanı hatası hem de bir çalışma zamanı hatası olarak işlenmesine olanak tanır.

Özel istisna sınıflarında neden super().__init__(self.msg) yaygın olarak kullanılıyor?

  • A

    Çoklu kalıtımı önlemek için

  • B

    Temel İstisna sınıfını doğru şekilde başlatmak için

  • C

    Geri izlemeyi geçersiz kılmak için

  • D

    İstisnayı otomatik olarak yükseltmek için

Açıklama:

super() işlevinin çağrılması, temel istisnanın mesajla birlikte doğru şekilde başlatılmasını sağlar.

Özel bir istisna __str__() işlevini geçersiz kılarsa ve bunun dışında yazdırılırsa ne yazdırılacaktır?

  • A

    Geçersiz kılınan dize gösterimi

  • B

    İstisnanın hafıza adresi

  • C

    Yalnızca sınıf adı

  • D

    repr() kullanılmadığı sürece hiçbir şey

Açıklama:

print(e), istisna nesnesinin __str__() işlevini çağırır.

Örneklerle PythonSınav Başarıyla Tamamlandı Puanınız :   2 /3 Kesinlik :  %0 Açıklamayı Görmek İçin Giriş Yapın 1 /3 1 /3 < Previous Sonraki >