Python ValueError, bir fonksiyonun kabul edebildiği türde bir değer almasına rağmen bu değerin beklenen biçime veya aralığa uymaması durumunda oluşur. Örneğin int("abc") çağrısında değer bir metindir ve int() metin kabul edebilir; ancak "abc" geçerli bir tam sayı gösterimi olmadığı için Python ValueError üretir. Çözüm, hatayı rastgele yakalamak değil, dönüşüm sınırına gelen verinin hangi biçimde olması gerektiğini belirlemektir.
TypeError ise çoğunlukla nesnenin türüyle yapılan işlemin uyumsuz olduğunu veya fonksiyonun beklediği argüman yapısının yanlış verildiğini gösterir. Bu nedenle düzeltmeye başlamadan önce sorunun değerin biçiminden mi, yoksa nesne türü ve işlem uyumsuzluğundan mı kaynaklandığını ayırmak gerekir.
ValueError Ne Anlama Gelir ve TypeError’dan Farkı Nedir?
ValueError için pratik düşünme biçimi şudur: “Fonksiyon bu türdeki veriyi kabul ediyor, fakat elimdeki değer o türün geçerli bir örneği değil.” int("42") başarılıdır; çünkü metin, tam sayı biçimindedir. int("42.5") ise metin türü kabul edilse bile geçerli bir tam sayı gösterimi olmadığı için ValueError oluşturur. Benzer biçimde float("3,14") ifadesi, virgül kullanan metin doğrudan Python’un beklediği ondalık biçime uymadığı için hata verebilir.
| Durum | Örnek | Hata sınıfı | Nasıl düşünülmeli? |
|---|---|---|---|
| Geçersiz değer biçimi | int("abc") |
ValueError |
Tür uygun, içerik dönüştürülemiyor. |
| Yanlış nesne türüyle işlem | "5" + 2 |
TypeError |
Metin ile sayı doğrudan toplanamaz. |
| Beklenmeyen argüman yapısı | len(10) |
TypeError |
Fonksiyon uzunluğu alınabilir bir nesne bekliyor. |
| Geçerli türde ama bulunamayan içerik | ["a", "b"].index("x") |
ValueError |
Liste uygun, aranan değer listede yok. |
Bu ayrım hata ayıklama süresini doğrudan etkiler. TypeError gördüğünüzde “Bu işlem için doğru nesne türünü mü kullanıyorum?” diye sorun. ValueError gördüğünüzde ise “Değer doğru türde olsa bile beklenen biçime, aralığa veya içeriğe uyuyor mu?” sorusunu sorun. Örneğin list.index() bir liste üzerinde çalıştığı için tür açısından sorun yaşamaz; fakat aranan eleman bulunamazsa ValueError üretir.
Benzer bir durum değişkenlere açma işleminde görülür: a, b = [10, 20, 30] satırında liste üç değer içerirken iki değişkene açılmaya çalışıldığı için ValueError oluşur. Buradaki problem listedeki nesnelerin türü değil, beklenen eleman sayısı ile gerçek eleman sayısının uyuşmamasıdır.
Bu farkı kısa alıştırmalarla pekiştirmek isteyenler, Python bilgi testi üzerinden dönüşüm, veri türleri ve hata sınıfları konusundaki temelini ölçebilir.
Traceback Satır Satır Nasıl Okunur?

Bir traceback’i okurken yukarıdan aşağıya üç bilgiyi takip edin: dosya adı ve satır numarası, çağrı zincirindeki fonksiyonlar, en alttaki istisna türü ve mesajı. En alt satır genellikle teşhisin en değerli bölümüdür. Örneğin ValueError: invalid literal for int() with base 10: 'abc' mesajı, int() fonksiyonunun "abc" metnini tam sayıya çeviremediğini açıkça söyler.
input() sonucunun her zaman metin olduğunu unutmayın. Kullanıcı Enter’a basarsa boş metin, yalnızca boşluk girerse boşluk karakterlerinden oluşan metin, 12,5 yazarsa virgüllü ondalık metin, on iki yazarsa harf içeren metin elde edilir. Hata çoğunlukla input satırında değil, bu metnin int() veya float() ile dönüştürüldüğü sınırda oluşur.
deger = input("Ondalık sayı: ")
print("Gelen veri:", repr(deger))
sayi = float(deger)
print("Sonuç:", sayi)
repr() kullanımı görünmeyen boşlukları ve boş metni fark etmeyi kolaylaştırır. Dosyadan okunan satırlar da çoğunlukla metindir; satır sonu karakteri, boş satır veya beklenmeyen bir alan biçimi dönüşüm sırasında aynı hatayı tetikleyebilir. Ayrıca ["a", "b"].index("c") bulunamayan eleman için, yanlış sayıda değişkene açma işlemi ise eleman sayısı uyuşmazlığı için ValueError üretir.
Traceback okumayı ve dönüşüm sınırlarını uygulamalı biçimde çalışmak isteyenler için birebir Python çalışma desteği, hatanın yalnızca mesajını değil, verinin programa nerede ve hangi biçimde girdiğini analiz etmeye odaklanır.
ValueError İçin Beş Adımlı Kalıcı Teşhis Akışı

ValueError çözümü, yalnızca hatayı yakalayıp programın devam etmesini sağlamak değildir. Önce hangi verinin, hangi işlemde ve hangi biçim beklentisine uymadığı bulunmalıdır. Aşağıdaki beş adım, kullanıcı girdisinden dosya okuma işlemlerine kadar çoğu senaryoda uygulanabilir.
- Girdiyi gözlemleyin. Değeri doğrudan ekrana basmak yerine
repr()ile görünür hâle getirin:
Böylece boş metin, baştaki veya sondaki boşluklar ve satır sonu karakterleri fark edilir. Geçici yama olarak yalnızca birkaçprint("Girdi:", repr(text))print()eklemek işe yarayabilir; kök neden çözümü ise programın gerçekten hangi girdiyi kabul ettiğini netleştirmektir. - Dönüşüm sınırını bulun. Hatanın
input(),file.read(),readline()veya liste erişiminden sonra hangi işlemde oluştuğunu belirleyin. Kırılma noktasıint(),float(),list.index()ya da çoklu atama sırasında yapılan unpacking işlemi olabilir. Hata mesajını bastırmak geçici bir yamadır; hangi satırda veri biçiminin bozulduğunu bulmak kalıcı teşhistir. - Beklenen biçimi tanımlayın. Programın tam olarak ne kabul edeceğini yazılı hâle getirin: yalnızca tam sayı mı, noktalı ondalık mı, virgüllü yerel gösterim mi, yoksa listede bulunan belirli bir eleman mı? “Sayı bekleniyor” ifadesi çoğu zaman yetersizdir; örneğin
18ile18.5aynı dönüşüm kuralına sahip değildir. - Doğrulama ekleyin. Dönüşümden önce çevresel boşlukları
strip()ile temizleyin, boş metni ayrıca kontrol edin ve gerekiyorsa kabul edilen biçimi doğrulayın. Yalnızca beklenenValueErrordurumunu yakalayın. Her şeyiexcept Exceptionveya bareexceptile sarmak, gerçek programlama hatalarını da gizleyerek geçici bir sessizlik oluşturur. - Sınır durumlarını test edin. Boş giriş, harf içeren metin, işaretli sayı, ondalık değer, fazla veya eksik parça, dosyadaki boş satır ve listede bulunmayan eleman ayrı ayrı denenmelidir. Sadece normal örneği test etmek geçici bir güven hissi verir; sınır testleri kök nedenin gerçekten ele alınıp alınmadığını gösterir.
Kendi hatanızı incelerken şu mini teşhis şablonunu doldurun: Girdi neydi? Hangi satırda dönüştü? Beklenen biçim neydi? Hangi doğrulama eksikti? Hangi sınır test edildi? Bu sorular, “çalışmıyor” ifadesini ölçülebilir bir hata tanımına dönüştürür.
Yaş Alan Programı: Hatalı Traceback’ten Doğrulanmış Çözüme
Aşağıdaki hatalı program, input() sonucunu doğrudan int() içine verir:
age = int(input("Yaşınızı girin: "))
print(f"Yaşınız {age}")
Kullanıcı on sekiz veya yalnızca boş metin girerse örnek traceback şu biçimde görünür:
Traceback (most recent call last):
File "yas.py", line 1, in <module>
age = int(input("Yaşınızı girin: "))
ValueError: invalid literal for int() with base 10: 'on sekiz'
Traceback’in en altındaki ValueError satırı, Python’ın metni tam sayıya çevirmeye çalıştığını fakat metnin beklenen biçimde olmadığını söyler. Program “çalışmıyor” değildir; beklenmeyen girdiyi ele almadığı için dönüşüm sınırında kırılmıştır.
text = input("Yaşınızı girin: ").strip()
if not text:
print("Yaş boş bırakılamaz.")
else:
try:
age = int(text)
except ValueError:
print("Lütfen yalnızca tam sayı girin.")
else:
if 0 <= age <= ไป:
print(f"Yaşınız kabul edildi: {age}")
else:
print("Yaş 0 ile 130 arasında olmalıdır.")
Yukarıdaki aralık satırında sözdizimsel bir hata oluşmaması için doğru sürüm şöyledir:
text = input("Yaşınızı girin: ").strip()
if not text:
print("Yaş boş bırakılamaz.")
else:
try:
age = int(text)
except ValueError:
print("Lütfen yalnızca tam sayı girin.")
else:
if 0 <= age <= 130:
print(f"Yaşınız kabul edildi: {age}")
else:
print("Yaş 0 ile 130 arasında olmalıdır.")
Beklenen çıktılar: Kullanıcı 25 girerse Yaşınız kabul edildi: 25 mesajı yazdırılır. Kullanıcı on sekiz girerse Lütfen yalnızca tam sayı girin. mesajı gösterilir; 150 girerse dönüşüm başarılı olur fakat aralık doğrulaması nedeniyle Yaş 0 ile 130 arasında olmalıdır. çıktısı alınır.
Bu küçük programda beş adım birlikte çalışır: giriş strip() ile gözlemlenip temizlenir, dönüşüm sınırı int() olarak belirlenir, beklenen biçim tam sayı şeklinde tanımlanır, yalnızca ValueError yakalanır ve boş, metinsel ya da aralık dışı girdiler sınır durumu olarak test edilir.
except Exception Hatasını Yutmak Neden Kalıcı Çözüm Değildir?
except Exception veya daha geniş olan except: kullanımı programın çökmesini engelleyebilir; ancak ValueError’un neden oluştuğunu ortadan kaldırmaz. Üstelik istisna yakalandıktan sonra hiçbir mesaj verilmezse hata ayıklamak zorlaşır ve program geçersiz veriyle çalışmayı sürdürebilir.
Örneğin aşağıdaki kod, dönüşüm hatasını sessizce yutar:
yas_metni = input("Yaşınız: ")
try:
yas = int(yas_metni)
except Exception:
pass
print("İşlem tamamlandı.")
Kullanıcı yirmi yazdığında int() bir ValueError üretir. Fakat hata sessizce yakalandığı için kullanıcı yalnızca İşlem tamamlandı. mesajını görür. Gerçekte yaş bilgisi oluşturulmamış ve işlem başarıyla tamamlanmamıştır.
Dosyadan veri okurken de benzer bir risk vardır. Sayıya dönüştürülmesi beklenen bir sütunda "bilinmiyor" değeri bulunabilir. Genel bir except bloğu bu satırı açıklama yapmadan atlarsa eksik kayıt fark edilmeyebilir. Daha kötüsü, program önceki veya varsayılan bir değerle devam ederek yanlış sonuç üretebilir.
Yalnızca beklenen hatayı kontrollü biçimde yakalayın
Dönüşüm sırasında beklenen sorun ValueError ise doğrudan bu istisna yakalanmalıdır. Kullanıcıya anlaşılır geri bildirim verilmeli ve geçersiz verinin normal işlem akışına girmesi önlenmelidir:
yas_metni = input("Yaşınız: ")
try:
yas = int(yas_metni)
except ValueError:
print(f"Geçersiz yaş değeri: {yas_metni!r}")
else:
print(f"Kaydedilen yaş: {yas}")
Bu yaklaşımın beklenen sonucu açıktır: Kullanıcı 25 girerse Kaydedilen yaş: 25, yirmi girerse Geçersiz yaş değeri: 'yirmi' mesajı gösterilir. Program başarısız bir dönüşümü başarılıymış gibi sunmaz.
Dosya işleme senaryosunda geçersiz satır atlanacaksa satır numarası, sorunlu değer ve atlama nedeni kaydedilmelidir. Böylece işlem devam ederken veri kaybı görünmez hâle gelmez. Kullanıcı girdisinde ise yeniden giriş istemek çoğu zaman yalnızca hata mesajı gösterip programı bitirmekten daha kullanışlıdır.
Kısa kontrol listesi
- Yakalanan istisna yalnızca beklenen
ValueErrorile sınırlandırıldı mı? - Kullanıcıya veya geliştiriciye sorunu açıklayan bir geri bildirim veriliyor mu?
- Geçersiz verinin kayıt, hesaplama veya sonraki işlem adımlarına ulaşması engelleniyor mu?
- Boş metin, boşluk, ondalık değer, virgüllü sayı ve beklenmeyen dosya satırı gibi sınır durumları test edildi mi?
Kök nedeni traceback ve ara değerler üzerinden tek başına belirlemekte zorlananlar için Python özel ders desteği, hatayı yalnızca kapatmak yerine teşhis sürecini birlikte uygulamak açısından değerlendirilebilir.
Sık Sorulan Sorular
ValueError ile TypeError arasındaki temel fark nedir?
ValueError, veri türü işleme uygun olduğu hâlde değerin kabul edilemez olduğunu belirtir; int("abc") buna örnektir. TypeError ise işlemin uyumsuz bir veri türüyle yapılmaya çalışıldığını gösterir.
Python’da input() ile alınan veri neden int() dönüşümünde ValueError oluşturur?
input() her zaman metin döndürür. Girilen metin tam sayı biçimine uymuyorsa, örneğin harf veya ondalık değer içeriyorsa, int() dönüşümü ValueError üretir.
Virgüllü ondalık sayı neden float() ile doğrudan dönüştürülemeyebilir?
float() ondalık ayırıcı olarak nokta kullanılan biçimi bekler. Bu nedenle "12,5" doğrudan dönüştürülemez; girdinin beklenen biçimi doğrulanmalı veya kontrollü biçimde dönüştürülmelidir.
ValueError alırken except Exception kullanmak neden önerilmez?
Çünkü yalnızca beklenen dönüşüm sorununu değil, programdaki başka hataları da yakalayarak gerçek arızayı gizleyebilir. Daha dar bir except ValueError bloğu, hata yönetimini anlaşılır ve güvenli tutar.
Traceback’te ValueError’un kaynağını bulmak için önce hangi satıra bakılmalıdır?
Önce traceback’in en altındaki istisna türü ve mesaj okunmalı, ardından çağrı zincirinde kendi dosyanıza ait en son satır incelenmelidir. Dönüşümü veya değer kontrolünü yapan ifade genellikle bu satırdadır.
ValueError’u kalıcı olarak düzeltmenin yolu hatayı susturmak değil; sorunlu değeri gözlemlemek, beklenen biçimi tanımlamak ve geçersiz verinin ilerlemesini kontrollü biçimde durdurmaktır.