logo

Ö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.

json dosyası
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:



java if else ifadesi
  • 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:

Java kuralları adlandırma
  • 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.