Bu Python Dersleri serimizde Python’da istisnaları ele alacağız.
Bir Python programı, bir hatayla karşılaştığı anda sona erer. Python’da bir hata, bir sözdizimi hatası veya bir istisna olabilir. Bu yazıda, bir istisnanın ne olduğunu ve bir sözdizimi hatasından nasıl farklı olduğunu göreceksiniz. Bundan sonra, istisnalar oluşturmayı ve assertion bulunmayı öğreneceksiniz. Ardından, try ve except bloğunun bir gösterimi ile bitireceksiniz.
İstisna ve Sözdizimi Hataları
Parse yanlış bir ifade algıladığında sözdizimi hataları oluşur. Aşağıdaki örneğe dikkat edin:
1 2 3 | print( 0 / 0 )) |
1 2 3 4 5 6 | File "main.py", line 1 print( 0 / 0 )) ^ SyntaxError: unmatched ')' |
Ok, ayrıştırıcının sözdizimi hatasıyla karşılaştığı yeri gösterir. Bu örnekte, bir parantez çok fazlaydı. Kaldırın ve kodunuzu tekrar çalıştırın:
1 2 3 | print( 0 / 0 ) |
1 2 3 4 5 6 | Traceback (most recent call last): File "main.py", line 1, in <module> print( 0 / 0 ) ZeroDivisionError: division by zero |
Bu sefer bir istisna hatasıyla karşılaştınız. Bu tür bir hata, sözdizimsel olarak doğru Python kodu bir hatayla sonuçlandığında ortaya çıkar. Mesajın son satırı, ne tür bir istisna hatasıyla karşılaştığınızı belirtir.
Python, mesaj istisna hatasını göstermek yerine, ne tür bir istisna hatasıyla karşılaşıldığını detaylandırır. Bu durumda, bir ZeroDivisionError idi. Python, çeşitli yerleşik istisnaların yanı sıra kendi kendini tanımlayan istisnalar oluşturma olanağıyla birlikte gelir.

İstisna Oluşturma
Bir koşul oluşursa bir istisna atmak için yükseltme kullanabiliriz. İfade özel bir istisna ile tamamlanabilir.
1 2 3 4 5 | x = 10 if x > 5: raise Exception('x > 5 olmaz') |
Kod çalıştırıldığında bir istisna oluşacak ve aşağıdaki gibi hata mesajı verecektir.
1 2 3 4 5 6 | Traceback (most recent call last): File "main.py", line 3, in <module> raise Exception('x > 5 olmaz') Exception: x > 5 olmaz |
AssertionError İstisnası Oluşturma
Bir programın yarıda çökmesini beklemek yerine Python’da bir iddiada bulunarak da başlayabilirsiniz. Belirli bir koşulun karşılandığını iddia ediyoruz. Bu koşulun Doğru olduğu ortaya çıkarsa, bu harika! Program devam edebilir. Koşul False olarak çıkarsa, programın AssertionError istisnası atmasını sağlayabilirsiniz.
1 2 3 4 5 6 7 8 9 | x = "merhaba" #Eğer şart True çıkarsa uyarı vermez assert (x == "merhaba") #Eğer şart False çıkarsa AssertionError hatası verir. assert( x == "dünya") |
1 2 3 4 5 6 | Traceback (most recent call last): File "main.py", line 7, in <module> assert( x == "dünya") AssertionError |
Python Try ve Except Blokların Sözdizimi
Python’daki try ve except ifadelerinin sözdizimini anlayarak başlayalım. Genel şablon aşağıda gösterilmiştir:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | try: # Hatalı olabilecek kod burada yazılır except <error type>: # İstisnayı işlemek için bunu yapın; # try bloğu bir hata verirse yürütülür else: # try bloğu hatasız bir şekilde başarılı bir şekilde yürütülürse bunu yapın finally: # Bu blok her zaman yürütülür |
Blokların ne için kullanıldığına bakalım:
try: try bloğu, yürütmeyi denemek istediğiniz ifadelerin bloğudur. Ancak, bir istisna nedeniyle çalışma zamanı hataları olabilir ve bu blok istendiği gibi çalışmayabilir.
except: Bir istisna nedeniyle try bloğu başarısız olduğunda istisna bloğu tetiklenir. Try bloğunda neyin yanlış gittiğine dair size genellikle bir bağlam sağlayan bir dizi ifade içerir.
Yukarıdaki snippet’te yer tutucusu tarafından belirtilen istisna bloğu içinde istisna olarak yakalamayı düşündüğünüz hata türünden(type error) her zaman bahsetmelisiniz. Ancak belirtmeden de kullanabilirsiniz. Ancak, oluşabilecek farklı hata türlerini hesaba katmadığınız için bu önerilen bir uygulama değildir.
Örneğin, aralık dışında bir dizin kullanarak bir listeye erişiyor, yanlış bir sözlük anahtarı kullanıyor ve var olmayan bir dosyayı açmaya çalışıyor olabilirsiniz.
Bu durumda IndexError, KeyError ve FileNotFoundError ile karşılaşabilirsiniz. Ve her hata türü için bir tane olmak üzere, tahmin ettiğiniz hata sayısı kadar dış blok eklemelisiniz.
else: else bloğu, yalnızca try bloğu hatasız yürütülürse tetiklenir. Bu, try bloğu başarılı olduğunda bir takip eylemi yapmak istediğinizde faydalı olabilir. Örneğin, bir dosyayı başarıyla açmaya çalışırsanız, içeriğini okumak isteyebilirsiniz.finally: finanlly bloğu, diğer bloklarda ne olduğuna bakılmaksızın her zaman yürütülür. Bu, belirli bir kod bloğunun yürütülmesinden sonra kaynakları boşaltmak istediğinizde kullanışlıdır.
Önümüzdeki birkaç dakika içinde, Python’daki istisnaları ele almak için şimdiye kadar öğrendiklerinizi kullanacaksınız. Hadi başlayalım.
try ve except Blokları: İstisnaları İşleme
Python’daki try ve except bloğu, istisnaları yakalamak ve işlemek için kullanılır. Python, programın “normal” bir parçası olarak try ifadesinin ardından kodu yürütür. except ifadesini izleyen kod, programın önceki try yan tümcesindeki istisnalara verdiği yanıttır.
1 2 3 4 5 6 | try: print(ad) except: print("Hata ad tanımlanmamış") |
1 2 3 | Hata ad tanımlanmamış |
Yukarıdaki örnekte ad değişkeni tanımlanmadığı halde program hata vermeden çalışmaya devam edecektir.
Yukarıdaki basit örnek pek işlevsel görünmüyor. Gerçek bir örnekle devam edelim. Bir dosyayı açıp yerleşik bir istisna kullandığınız başka bir örnek:
1 2 3 4 5 6 7 | try: with open('file.log') as file: data = file.read() except: print('file.log dosyasına ulaşamadık.') |
file.log dosyası yoksa aşağıdaki gibi bir uyarı verecektir.
1 2 3 | file.log dosyasına ulaşamadık. |
Python’da yerleşik bir çok istisna türü vardır. Burada oluşan istisna FileNotFoundError istisnasıdır. Eğer sadece bu istisnayı kontrol etmek istiyorsanız FileNotFoundError istisnasını eklemelisiniz.
Bu tür bir istisnayı yakalamak ve ekrana yazdırmak için aşağıdaki kodu kullanabilirsiniz:
1 2 3 4 5 6 7 | try: with open('file.log') as file: data = file.read() except FileNotFoundError as hata: print('file.log dosyasına ulaşamadık.\n',hata) |
1 2 3 4 | file.log dosyasına ulaşamadık. [Errno 2] No such file or directory: 'file.log' |
Try yan tümcenizde birden fazla işlev çağrısı olabilir ve çeşitli istisnaları yakalamayı bekleyebilirsiniz. Burada dikkat edilmesi gereken nokta, try yan tümcesindeki kodun bir istisna ile karşılaşıldığında duracağıdır.
Aşağıdaki koda bakın. Burada önce int ve string türünde iki değeri toplamayı ve ardından bir dosya açmayı denersiniz: (TypeError veFileNotFoundError istisnaları devreye girer)
1 2 3 4 5 6 7 8 9 10 | try: toplam = "10"+10 with open('file.log') as file: data = file.read() except FileNotFoundError as hata: print('file.log yok: ',hata) except TypeError as hata2: print("Veri Türü hatası :",hata2) |
1 2 3 | Veri Türü hatası : can only concatenate str (not "int") to str |
TypeError hatası devreye girer ve try içindeki diğer kod yürtülmez.
else Bloğu
Python’da, else deyimini kullanarak, bir programa yalnızca istisnalar olmadığında belirli bir kod bloğunu yürütmesini söyleyebilirsiniz.
1 2 3 4 5 6 7 8 | try: toplam = 10 + 20 except TypeError as hata: print("Hata oldu:", hata) else: print("Hata yok!") |
1 2 3 | Hata yok! |
Eğer hatalı kod yazacak olursak else çalışmayacak ve except istisna üretecektir.
1 2 3 4 5 6 7 8 | try: toplam = "10" + 20 except TypeError as hata: print("Hata oldu:", hata) else: print("Hata yok!") |
1 2 3 | Hata oldu: can only concatenate str (not "int") to str |
finally Bloğu
Kodunuzu yürüttükten sonra temizlemek için her zaman bir tür eylem uygulamak zorunda olduğunuzu hayal edin. Python, nihayet yan tümcesini kullanarak bunu yapmanızı sağlar.
Aşağıdaki örneğe bir göz atın:
1 2 3 4 5 6 7 8 9 10 11 | try: file = open("dosya.txt") except: print("dosya okuma hatası") else: print(file.read()) file.close() finally: print("dosya okuma bitti") |
Eğer dosya yoksa şöyle bir ekran çıktısı oluşacaktır.
1 2 3 4 | dosya okuma hatası dosya okuma bitti |
Python’da ZeroDivisionError Nasıl İşlenir
Aşağıda gösterilen bolme() fonksiyonu göz önünde bulundurun. İki argüman alır – sayi ve bolen ardından fonksiyon içinde sayi/bolen işlemini yapar ve sonucu döndürür.
1 2 3 4 | def bolme(sayi,bolen): return sayi/bolen |
Yukarıdaki program farklı sayılar ile çağrıldığında aşağıdaki gibi sonuçlar elde ederiz.
1 2 3 4 5 6 7 | def bolme(sayi,bolen): return sayi/bolen print(bolme(5,10)) print(bolme(100,10)) |
1 2 3 4 | 0.5 10.0 |
Bu kod, siz sıfıra bölmeyi deneyene kadar sorunsuz çalışır. Programı aşağıdaki gibi çalıştırdığımızda bir ZeroDivisionError atarak çöktüğünü görüyorsunuz.
1 2 3 4 5 6 | def bolme(sayi,bolen): return sayi/bolen print(bolme(5,0)) |
1 2 3 4 5 6 7 8 | Traceback (most recent call last): File "main.py", line 4, in <module> print(bolme(5,0)) File "main.py", line 2, in bolme return sayi/bolen ZeroDivisionError: division by zero |
Aşağıdakileri yaparak bu bölümü bir istisna olarak sıfırla işleyebilirsiniz:
try bloğunda, bolme() işlevine bir çağrı yapın. Özünde, sayi / bolen yapıyorsunuz.
exept blok içinde bir istisna olarak bolme() olduğunda durumu ele alın.
Bu örnekte, kullanıcıya sıfıra bölmeyi denediğini bildiren bir mesaj yazdırarak ZeroDivisionError‘ı hariç tutabilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 | def bolme(sayi,bolen): sonuc = "" #hata kontrolü try: sonuc = sayi / bolen except ZeroDivisionError: print("Sayıyı 0(Sıfır)'a bölmeye çalışyorsunuz") return sonuc print(bolme(25,0)) # istisna oluşturacak kod print(bolme(25,5)) |
1 2 3 4 5 | Sayıyı 0(Sıfır)'a bölmeye çalışyorsunuz 5.0 |
Python’da TypeError Nasıl İşlenir?
Bu bölümde, Python’da bir TypeError‘ı işlemek için try ve except’i nasıl kullanabileceğinizi göreceksiniz.
Örnekte iki sayıyı alıp bunları toplayan uygulamayı göstereceğiz.
1 2 3 4 5 6 7 | def topla(s1,s2): return s1 + s2 print(topla(100,200)) print(topla(10,20)) |
Program çalıştırıldığında her hangi bir istisna oluşturmadan aşağıdaki gibi çıktı üretecektir.
1 2 3 4 | 300 30 |
Her hangi bir sayı türündeki tüm işlemleri yapıyor fakat gönderdiğimiz sayı metinsel olarak (“10”) giderse metin+sayı işlemini yapamayacağı için TypeError istisnası fırlatacaktır.
1 2 3 4 5 6 | def topla(s1,s2): return s1 + s2 print(topla("10",20)) |
1 2 3 4 5 6 7 8 | Traceback (most recent call last): File "main.py", line 4, in <module> print(topla("10",20)) File "main.py", line 2, in topla return s1 + s2 TypeError: can only concatenate str (not "int") to str |
can only concatenate str (not "int") to str iki stringi birleştireceğinizi tam sayıları yapamayacağınızı ifade etmektedir.
Şimdi kodumuza try except bloklarını ekleyerek hata mesajı verdirelim.
1 2 3 4 5 6 7 8 9 10 11 12 | def topla(s1,s2): try: return s1 + s2 except TypeError: print("Toplama için ikisi de sayı türünde olmalıdır.") return 0 print(topla("10",20)) |
1 2 3 4 | Toplama için ikisi de sayı türünde olmalıdır. 0 |
Özet
- Sözdizimi hataları ve istisnalar arasındaki farkı gördükten sonra, Python’da istisnaları oluşturmanın, yakalamanın ve işlemenin çeşitli yollarını öğrendiniz. Bu makalede, aşağıdaki seçenekleri gördünüz:
- raise, istediğiniz zaman bir istisna atmanıza izin verir.
- assert, belirli bir koşulun karşılanıp karşılanmadığını doğrulamanıza ve değilse bir istisna oluşturmanıza olanak tanır.
- try yan tümcesinde, bir istisna ile karşılaşılıncaya kadar tüm ifadeler yürütülür.
- except, try yan tümcesinde karşılaşılan özel durum(lar)ı yakalamak ve işlemek için kullanılır.
- else, yalnızca try yan tümcesinde hiçbir özel durumla karşılaşılmadığında çalışması gereken bölümleri kodlamanıza izin verir.
- finally, daha önce karşılaşılan istisnalar olsun veya olmasın, her zaman çalışması gereken kod bölümlerini yürütmenizi sağlar.









1 Yorum