Hata Yakalama - Python Dersleri (Tutorials)

avatar

object.jpg

Merhabalar

Python programlama derslerinin bu bölümünde "hata yakalama" konusu üzerinde duracağız. Bir önceki dersimizde Python'daki hata çeşitlerini ve hangi durumlarda hata alabileceğimizi görmüştük.

Bu bölümde olası hata alabileceğimiz kodları yakalayabileceğimiz try - except - finally bloklarını göreceğiz.

try, except blokları

try, except bloğunda hata olabilecek kodlar, try bloğu içerisine yerleştirilir. Bir try- except yapısında hatanın çeşidine göre programcı birden fazla except bloğu kullanabilir.

try bloğundaki kodlar çalıştırıldığında olası bir hata meydana gelmesi durumunda -program hangi çeşit hatayı veriyorsa-o hatanın olduğu except bloğuna gider.

try- except bloğunun genel yapısı aşağıdaki gibidir :

try bloğunda bulunan bir grup kod ifadesinin herhangi birinde bir hata meydana geldiğinde sonrasındaki kodlar işlenmeden ilgili except bloğundan program devam edecektir.

Uygulama 1

Uygulamasını görelim. Hata alabileceğimiz bir kod yazalım ve sonucu inceleyelim :

Örneğimizde kullanıcıdan bir sayı girmesi istenmiştir. Bu kodda kullanıcı sayı girerse herhangi bir hata ile karşılaşılmayacaktır. Ancak kullanıcı sayı dışında herhangi bir şey girdiğinde hata alınacaktır.

Hata

sayi = int(sayi)

kodunun olduğu yerde meydana gelecektir. Rakamsal girilmeyen ifadeyi int() metodu sayıya çevirmeye çalışacak ancak başarılı olamayacağından hata fırlatacaktır.

try bloğunda bu koddan sonraki

print("try bloğu sonu...")

kodu atlanacak direk except bloğuna geçilecektir. except bloğundaki kodlar işlendikten sonra devamında program çalışmaya devam edecektir.

Kullanıcı hatalı bir giriş yaptığında çıktımız aşağıdaki gibi olacaktır:

Ancak kullanıcı sayısal değerler girdiğinde herhangi bir hata olmayacağından sadece try bloğu çalışacak ve çıktımız aşağıdaki gibi olacaktır :


Uygulama 2

except bloğu, uygulama 1 de tek başına kullanılabildi. İsteğe bağlı olarak except bloğunun hemen yanına hatayı girebiliriz:

Uygulama 1'de try bloğu içerisinde hangi çeşit hata olursa olsun, hata oluştuğunda except bloğuna geçecektir.

Ancak biz programı yukarıdaki gibi değiştirdiğimizde yani hatayı except bloğunun yanında verdiğimizde sadece ValueError hataları için except bloğuna geçilecektir.

Söylediklerimizin kontrolünü yapalım. try bloğu içerisindeki kodları ValueError olmayacak şekilde değiştirip programda hata alınmasını sağlayalım :

Örneğimizde tanımlanmamış mesaj değişkenini yazdırmaya çalıştık. Yani NameError hatası yaptık. Farklı türden bir hata olduğu için except bloğuna girilmedi ve programımız çakıldı. Çıktımız aşağıdaki gibidir :


Uygulama 3

Şimdi de birden fazla hata seçeneği olan bir uygulama hazırlayalım.

Örneğimizde basit bir bölme işlemi yapılıp sonucu ekrana yazdırılmaktadır. Bölme işlemi yapılacak sayılar kullanıcıdan istenmiştir.

Eğer kullanıcı sayısal değerler girerse herhangi bir hata ile karşılaşmayız. Ancak sayısal değerler dışında herhangi bir karakter girilirse ValueError except bloğuna girilecektir.

İkinci except bloğu ise bölme işleminde kullanıcının ikinci sayıyı sıfır verme olasılığı için hazırlanmıştır. Herhangi bir sayı sıfıra bölünemeyeceğinden oluşabilecek hata, bu bloktan devam edecektir.

Uygulamanın olası 3 senaryosuna göre çıktımızı görelim :

  • Kullanıcı herhangi bir hata yapmamıştır :

  • Kullanıcı sayısal karakter girmemiştir:

Çıktıda görüldüğü gibi kullanıcının girdiği ilk hatalı girişten sonraki kodlar çalışmadan direk except ValueError bloğuna geçilmiş ve buradaki kodlar çalıştırılmıştır.

  • Kullanıcı ikinci sayıyı sıfır olarak girmiştir :


Bu 3 uygulamayla birlikte try except yapısının mantığı biraz olsun anlaşılmıştır, umarım.

Konuyu toparlayacak olursak programcı try except yapısını kullanarak daha kontrollü programlar yazabilir.

try except yapısı olmasaydı bu uygulamalar, hatayı gördükleri an çakılırdı. Ancak uygulama hem çakılmadı hem de kullanıcıya yaptığı hatadan dolayı bilgilendirme mesajı verilebildi.

Şimdilik bu kadar.

Umarım faydalı bir çalışma olmuştur.

Teşekkürler.

yesilayrca.png

Kaynak belirtilmeyen görseller bana aittir. The pictures without source in the post is belong to me



0
0
0.000
6 comments
avatar

You got a 27.40% upvote from @joeparys! Thank you for your support of our services. To continue your support, please follow and delegate Steem power to @joeparys for daily steem and steem dollar payouts!

0
0
0.000