Modül dersleri (4/4)
Hata işleme: dene/hariç
Çalışma zamanında bir şeyler ters gittiğinde (sıfıra bölme, eksik anahtar,
Uyumsuz türlerde işlem yapılması) Python bir istisna oluşturur. olmadan
özel durum programı kesintiye uğratır. try / except ile siz
onu yakalayabilir ve ne yapacağına karar verebilir.
Temel biçim
try:
risultato = 10 / 0
except ZeroDivisionError:
risultato = None
risultato # Nonetry:bloğu başarısız olabilecek kodu içeriyor;except <ErrorType>:yalnızca bu hata türü ortaya çıktığında yürütülürtryiçinde.
İstisna mesajını yakalamak
İstisna nesnesini bir ada bağlamak için as kullanın:
try:
int("non è un numero")
except ValueError as e:
messaggio = str(e)
messaggio # "invalid literal for int() with base 10: 'non è un numero'"Birden fazla tür bir arada
try:
valore = dati[chiave]
except (KeyError, IndexError):
valore = NoneBir grup tür, bu türlerin (veya alt sınıfların) herhangi bir istisnasını yakalar.
Tam yapı: deneyin / hariç / başka / nihayet
try:
n = int("42")
except ValueError:
print("not a number")
else:
print(f"parsed: {n}") # executed only if NO exception occurred
finally:
print("always executed") # executed regardless, even on exceptionelse— bunutrybaşarısına bağlı olan kod için kullanın. Sakla kazara ilgisiz istisnaları yakalamamanız için ayırın.finally— her zaman gerçekleşmesi gereken temizleme (bir dosyayı kapatmak, bir dosyayı serbest bırakmak) kaynak). Hem başarı hem de hata üzerine gerçekleştirildi.
Bir istisna oluşturuluyor: raise
Bazen bir şeylerin ters gittiğinin sinyalini vermek isteyen siz olursunuz:
def diviso(a, b):
if b == 0:
raise ValueError("the divisor cannot be zero")
return a / bKarşılaşacağınız ve gündeme getireceğiniz en yaygın yerleşik istisnalar:
ValueError— değer doğru türde ancak kabul edilemez (örn. ayrıştırma).TypeError— tür yanlış (ör.len(42)).KeyError/IndexError— eksik anahtar/dizin.ZeroDivisionError— sıfıra bölme.FileNotFoundError,PermissionError— dosya sistemi işlemleri.
Try bloklarındaki else ve nihayet cümlecikleri
Bir try bloğu iki ek cümleyi tanımlayabilir:
else: yalnızcatrybloğu herhangi bir istisna oluşturmadan tamamlanırsa yürütülür.finally: bir istisnanın oluşup oluşmadığına bakılmaksızın her zaman yürütülür. Bu, kaynakları temizlemek için idealdir (örneğin, açık bir dosyayı veya veritabanı bağlantısını kapatmak).
Kendin dene
int('abc') komutunu deneyen bir ifade yazın: eğer ValueError ortaya çıkarsa, 'errore' dizesini 'result'a atayın; aksi halde numarayı atayın. 'Sonucu' değerlendirin.
İpucu göster
int('abc') ValueError'ı yükseltir.
3 denemeden sonra çözüm mevcut
Alıştırmayı gözden geçirin
a/b'yi döndüren ancak b'nin 0 olması durumunda 'böl sıfır' mesajıyla ValueError'ı yükselten 'divide(a, b)'yi tanımlayın. Daha sonra bir try/hariç içinde bölmeyi(10, 0) çağırın ve yakalanan istisnanın dizesini 'message'a atayın.
İpucu göster
fonksiyonun içinde ValueError('...') değerini yükseltin; ValueError dışında e olarak yakalayın.
3 denemeden sonra çözüm mevcut
Ek zorluk
\`text_val = "abc"\` dizesini bir tamsayıya dönüştürmek için bir \`try-hariç\` bloğu yazın. Dönüşüm \`ValueError\` sonucunu verirse \`sonuç\`a \`Yok\` atayın. Aksi takdirde dönüştürülen numarayı atayın. Son olarak \`sonucu\` değerlendirin.
İpucu göster
try: result = int(text_val) ve ardından hariç ValueError: result = Yok'u kullanın.
3 denemeden sonra çözüm mevcut