Menu
Coddy logo textTech

İstisna Yönetimi (Exception Handling) Nedir?

İstisna yönetimi (exception handling), bir programın çalışırken ortaya çıkan hatalara yanıt vermesinin bir yoludur. Hata verebilecek kod try gibi korumalı bir bloğa konur; bir hata fırlatıldığında program çökmek yerine kontrol except ya da catch gibi bir handler'a geçer.

Yazan Kevin Spektor, Kurucu ortak ve CTO

Güncellendi: 24 Eylül 2026

İnsanlara yaşlarını soran bir program er ya da geç 20 yerine "twenty" alır. Bu metni dönüştürmek bir çalışma zamanı hatasıdır: int("twenty") bir ValueError fırlatır ve bunun için bir plan yoksa program durur. İstisna yönetimi o plandır. Hata verebilecek kodu işaretlersin ve hata olursa çalışacak kodu yazarsın.

Next year you will be 35
Not a number: twenty
Next year you will be 20
Done

Hatalı cevap bildirilir ve döngü bir sonrakiyle devam eder. try olmasaydı program bir satır yazdırır, ardından bir traceback yazdırırdı.

İstisna yönetimi nasıl çalışır

  1. try içindeki kod normal şekilde çalışır.

  2. Bir işlem başarısız olur ve runtime bir istisna fırlatır: bir tipi (ValueError) ve bir mesajı (invalid literal for int() with base 10: 'twenty') olan bir nesne.

  3. try bloğu o satırda durur. Kalan satırları atlanır; "twenty" için "Next year you will be" yazdırılmamasının nedeni budur.

  4. Runtime istisnanın tipini her except bloğuyla yukarıdan aşağıya karşılaştırır ve eşleşen ilkini çalıştırır.

  5. Handler bittikten sonra program, try ifadesinin tamamından sonraki ilk satırla devam eder.

  6. Hiçbir blok eşleşmezse istisna mevcut fonksiyondan çıkar ve arama onu çağıran fonksiyonda, sonra onu çağıranda sürer. Buna çağrı yığınının geri sarılması (unwinding) denir. Arama eşleşme olmadan programın en üstüne ulaşırsa program bir traceback ile sona erer.

  7. adım, handler'ın hatanın olduğu fonksiyonda olmak zorunda olmadığı anlamına gelir. Burada hata iki çağrı derinlikte oluşuyor ve en alttaki handler yine de onu yakalıyor:

parsing 4.50
parsing free
Could not add the prices: could not convert string to float: 'free'

float("free"), parse_price içinde başarısız oldu. Ne parse_price ne de total bir handler'a sahipti, bu yüzden ikisi de yarıda bırakıldı ve "3.20" hiç ayrıştırılmadı. İstisna yönetiminin sana verdiği asıl tasarım seçimi budur: bir hatayı, onunla ne yapacağını bildiğin yerde ele al; bu yer çoğu zaman hatanın olduğu yerden uzaktır.

try, except, else ve finally

Python'un try ifadesinin iki opsiyonel parçası daha vardır. else yalnızca try bloğu istisnasız bittiğinde çalışır. finally her durumda çalışır: başarıdan sonra, ele alınmış bir istisnadan sonra, hatta fonksiyon try içinden return ettiğinde bile.

no error
finally runs either way
2.0
b was zero
finally runs either way
None

Temizlik finally içine konur: bir dosyayı kapatmak, bir kilidi bırakmak, bir veritabanı bağlantısını kapatmak. Python'da with ifadesi dosyalar için bu temizliği otomatik yapar ve dosyalar için olağan tercih odur.

Kendi istisnalarını fırlatmak

İstisnalar yalnızca dilin tespit ettiği hatalar için değildir. Kendi fonksiyonun çalışamayacağı bir girdi aldığında reddetmek için bir istisna fırlatabilir ve sonra ne olacağına çağıran karar verir. Küçük bir istisna sınıfı tanımlamak hataya onu anlatan bir isim verir.

70
Refused: cannot take 250, balance is 100

Python raise kullanır. Java, C++ ve JavaScript aynı iş için throw kullanır.

Diğer dillerde istisna yönetimi

DilAnahtar kelimelerBilmeye değer
Pythontry, except, else, finally, raiseHer istisna BaseException'dan kalıtım alan bir nesnedir
Javatry, catch, finally, throw, throwsIOException gibi kontrollü istisnalar yakalanmalı ya da throws ile bildirilmelidir
C++try, catch, throwfinally yok; yığın geri sarılırken yıkıcılar temizlik yapar
JavaScripttry, catch, finally, throwasync koddaki hatalar await etrafındaki try ile yakalanır
CyokFonksiyonlar bir hata kodu döndürür, birçoğu errno ayarlar
Gosıradan hatalar için yokFonksiyonlar, çağıranın kontrol ettiği bir error değeri döndürür

Aynı ayrıştırma örneği Java'da şöyle görünür:

try {
    int age = Integer.parseInt("twenty");
    System.out.println(age + 1);
} catch (NumberFormatException e) {
    System.out.println("Not a number: " + e.getMessage());
} finally {
    System.out.println("done");
}

Java istisnaları iki gruba ayırır. IOException gibi kontrollü (checked) istisnalar programın kontrolü dışındaki sorunları anlatır ve derleyici onları ne yakalayan ne de bildiren kodu derlemeyi reddeder. NullPointerException gibi RuntimeException alt sınıfları olan kontrolsüz (unchecked) istisnalar genellikle bir bug anlamına gelir ve derleyici seni onları ele almaya zorlamaz.

Sık yapılan hatalar

  • Her şeyi yakalamak. Python'da çıplak bir except: KeyboardInterrupt'ı da yakalar, bu yüzden Ctrl+C çalışmaz olur; except Exception: ise hiç planlamadığın bug'ları yakalar. Nasıl ele alacağını bildiğin belirli tipi yakala.
  • Hatayı yutmak. except ValueError: pass sorunu gizler. En azından neyin ters gittiğini yazdır ya da logla.
  • Fazla büyük bir try bloğu. Yalnızca yakaladığın istisnayı fırlatabilecek satırları sar; böylece ilgisiz bir hata yanlışlıkla ele alınmaz.
  • Bug'ları düzeltmek yerine yakalamak. Bir adım fazla çalışan bir döngüden gelen IndexError kodda bir yanlıştır. Onu ele almak yanlış kodu yaşatır.
  • C ya da C++'ta catch'in bir çökmeyi durdurmasını beklemek. Bir segmentation fault istisna değil, işletim sisteminden gelen bir sinyaldir ve Linux ile macOS'ta bir C++ catch (...) onu asla görmez.

Sırada ne var

İstisna yönetiminin yanıt verdiği hatalar çalışma zamanı hatası sayfasında, yakalayamadığı çökme ise segmentation fault sayfasında anlatılıyor. Sözdiziminin tamamı için Python istisnaları, Java try ve catch, C++ istisnaları ve JavaScript try ve catch rehberlerini oku. Java kursu ve Python kursu ikisi de bunları gerçek alıştırmalarla pratik ettirir.

Sıkça Sorulan Sorular

Java'da istisna yönetiminin 5 anahtar kelimesi nedir?
try, catch, finally, throw ve throws. try izlenecek kodu işaretler, catch belirli bir istisna tipini ele alır, finally bir istisna olsa da olmasa da temizlik kodunu çalıştırır. throw bir istisna fırlatır; bir metot imzasındaki throws ise metodun çağırana hangi kontrollü (checked) istisnaları iletebileceğini bildirir.
C++'ta istisna yönetimi nasıl yapılır?
C++ try, catch ve throw kullanır. Her tip fırlatılabilir ama gelenek olarak std::runtime_error gibi std::exception'dan türeyen bir nesne fırlatılır ve referansla yakalanır: catch (const std::exception& e). C++'ta finally yoktur; temizlik, yığın geri sarılırken otomatik çalışan yıkıcılarda (destructor) yapılır.
Hata (error) ile istisna (exception) arasındaki fark nedir?
Günlük kullanımda hata, ters giden her şeydir; istisna ise bir dilin bunu bildirmek için kullandığı nesnedir. Java daha keskin bir çizgi çeker: Exception bir programın makul şekilde ele alabileceği sorunları kapsar, OutOfMemoryError ya da StackOverflowError gibi Error ise programın genellikle yakalamaya çalışmaması gereken bir JVM arızasını bildirir. Python'da ValueError ve ZeroDivisionError, adlarına rağmen ikisi de istisnadır.
Java'da throw ile throws arasındaki fark nedir?
throw, o noktada tek bir istisna fırlatan bir ifadedir: throw new IllegalArgumentException("negative age");. throws ise metodun çağırana iletebileceği kontrollü istisnaları listeleyen, metot bildiriminin bir parçasıdır: void load() throws IOException. Derleyici bundan sonra her çağıranı o istisnayı ya yakalamaya ya da kendisi de bildirmeye zorlar.
İstisna yönetimi kodu yavaşlatır mı?
Çoğu modern dilde bir try bloğuna girmek ucuzdur. Python 3.11'den beri istisna fırlatılmadığında bir try neredeyse hiçbir maliyet getirmez ve büyük C++ derleyicileri hiçbir şeyin fırlatılmadığı yola çalışma zamanı maliyeti eklemez. Bir istisnayı fırlatıp yakalamak ise bir if testinden çok daha yavaştır; bu yüzden performansın kritik olduğu döngülerde istisnalara güvenmek yerine sık görülen durumları kontrol et.
Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA