Hata ayıklamada raise anahtar kelimesi ne işe yarar

def kutleindelsihesaplama():
    a = input("Kilonuzu ve boyunuzu giriniz(İsminizi girmeyiniz.).Lütfen ',' ile ayırın. ")
    aa = a.split(",")
    for i in aa:
        if type(i) != int:
            raise ValueError("Yanlış girdiniz.")
    return aa

try:
    print(kutleindelsihesaplama())
    print("Program burada")
except ValueError:
    print("Lütfen sayı giriniz.")
Selamlar,raise anahtar kelimesi ne işe yarıyor acaba tam anlayamadım.
raise anahtar kelimesi olmadan hata yakalayamıyor mu python?
Ek olarak program "Lütfen sayı giriniz." diyor.Öyleyse neden ValueError("Yanlış girdiniz") yazdık?

Merhaba,

Burada kullanıcıdan girmesi beklenen değer 1,2 gibi virgülle ayrılmış sayılar. aa = a.split(",") ile de girilen değer , işaretinden ayrılıyor ve sayılar birer tuple nesnesinin elemanı haline getiriliyor. split metodu, str nesnesini split'e yazılan karakterden ayırır ve ayrılan parçalar bir demet nesnesine yerleştirilir.

Kullanıcının sayı girmeme ihtimaline karşı bir sorgu tanımlanmış. Ve burada virgül ile ayrılan elemanlardan herhangi birisi sayı değilse raise ValueError deyimi kullanılarak bir hata yükseltilir. Bu örnekte raise ValueError kullanılmasının gerekçesi tam olarak bu.

print("merhaba")

fonksiyondaki input() kullanıcıdan 56,180 gibi bir değer alıyor. Sonra bunu , karakterinden ayırıp ["56","180"] gibi bir liste alıyor. Fakat bu listenin ögeleri str. Bu yüzden

raise ValueError("Yanlış girdiniz.")

kodu ile bir hata kaldırır

En altta ise

try:
    print(kutleindelsihesaplama())
    print("Program burada")
except ValueError:
    print("Lütfen sayı giriniz.")

olduğu için hatayı tspit edip yerine "lütfen sayı giriniz"ifadesini ekrana yazdırır.

Umarım anlatabilmişimdir
:grinning:

Hocam onu anladım teşşekkürler de neden raise ValueError() bu ifadedeki parantezin içine bir string yazı-
yoruz.Yani bu yazdığımız ekrana yazdırılmıyor bile.

Hocam seninkinden belki daha basittir ama

sence böyle daha da kolay değil mi:

def kutleindexhesapla():
    while True:
        try:
            a = float(input("Kilonuz (örn: 65) : "))
            aa = float(input("Boyunuz (Örn: 1.82) : "))
            sonuc = round(a/aa**2,2)
            print(sonuc)
            ask = input("işlemin hesaplandı. Çıkış yapacak mısın? [Yes (y),No (n)] : ")
            if ask == "y":
                break
            else:
                pass
        except ValueError:
            print("Hatalı Giriş Yaptınız Bir daha!")
kutleindexhesapla()

Birde böyle bir bilgi buldum:

raise
Bazen, yazdığımız bir programda, kullanıcının yaptığı bir işlem normal şartlar altında hata vermeyecek olsa bile biz ona ‘Python tarzı’ bir hata mesajı göstermek isteyebiliriz. Böyle bir durumda ihtiyacımız olan şey Python’ın bize sunduğu raise adlı deyimdir. Bu deyim yardımıyla duruma özgü hata mesajları üretebiliriz. Bir örnek verelim:

bölünen = int(input("bölünecek sayı: "))

if bölünen == 23:
    raise Exception("Bu programda 23 sayısını görmek istemiyorum!")

bölen = int(input("bölen sayı: "))
print(bölünen/bölen)

Burada eğer kullanıcı 23 sayısını girerse, kullanıcıya bir hata mesajı gösterilip programdan çıkılacaktır. Biz bu kodlarda Exception adlı genel hata mesajını kullandık. Burada Exception yerine her istediğimizi yazamayız. Yazabileceklerimiz ancak Python’da tanımlı hata mesajları olabilir. Örneğin NameError, TypeError, ZeroDivisionError, IOError, vb…

Bir örnek verelim:

tr_karakter = "şçğüöıİ"

parola = input("Parolanız: ")

for i in parola:
    if i in tr_karakter:
        raise TypeError("Parolada Türkçe karakter kullanılamaz!")
    else:
        pass

print("Parola kabul edildi!")

Bu kodlar çalıştırıldığında, eğer kullanıcı, içinde Türkçe karakter geçen bir parola yazarsa kendisine TypeError tipinde bir hata mesajı gösteriyoruz. Eğer kullanıcının parolası Türkçe karakter içermiyorsa hiçbir şey yapmadan geçiyoruz ve bir sonraki satırda kendisine ‘Parola kabul edildi!’ mesajını gösteriyoruz.

raise deyimini, bir hata mesajına ek olarak bir işlem yapmak istediğimizde de kullanabiliriz. Örneğin:

try:
    bölünen = int(input("bölünecek sayı: "))
    bölen = int(input("bölen sayı: "))
    print(bölünen/bölen)
except ZeroDivisionError:
    print("bir sayıyı 0'a bölemezsiniz")
    raise

Burada, eğer kullanıcı bir sayıyı 0’a bölmeye çalışırsa, normal bir şekilde ZeroDivisionError hatası verilecek ve programdan çıkılacaktır. Ama bu hata mesajıyla birlikte kullanıcıya ‘bir sayıyı 0’a bölemezsiniz,’ uyarısını da gösterme imkanını elde edeceğiz. Yani burada except ZeroDivisionError bloğunu herhangi bir hatayı engellemek için değil, hataya ilave bilgi eklemek için kullanıyoruz. Bunu yapmamızı sağlayan şey tabii ki bu kodlar içinde görünen raise adlı deyimdir…

Kaynak

Hata yaptik. Daha dogrusu kullanmayacagimiz bir sey yazdik.

Veya belki atilan exception’lari tutup loglayan bir sistem vardir. O halde o exception mesaji olarak “Yanlis girdiniz” gorur. Tahmin edilebilecegi uzere bu bir exception mesaji olarak son derece kullanissiz cunku (kullanici goremeyecegi halde) kullaniciya hitap ediyor.

Dogrusu tam olarak yapilan hatayi kaydedip kullanim sekline gore yorumlamak:

if (type(i) != int):
  raise VirgulunEtrafindaSayiYok(
    "',' ile split ettigimiz girdinin bir parcasi int'e cevrilemiyor"
  )
...
except VirgulunEtrafindaSayiYok:
  print("Kilonuz ve boyunuz sayi olmali (orn: \"70,162\""), file=sys.stderr)

BaseException’dan turemis herhangi bir sinif veya ornegi olabilir. Python’a tanimli hata siniflari olmak zorunda degil, hatta bu siniflardan biri derdi tam olarak anlatmiyorsa kendi sinifini uretmek tercih edilir.

1 Beğeni

Aynen hocam sizin ilk yazdığınız daha kolay gibi.Cevap için teşşekkürler :d

hmmm tamamdır bilgiler için teşşekkürler