Error Handling (101): panic! ve Result<T, E> Kullanımı

  • Konbuyu başlatan Konbuyu başlatan irfo
  • Başlangıç tarihi Başlangıç tarihi

irfo

Moderatör
Katılım
7 Ocak 2026
Mesajlar
290
Tepkime puanı
2
Puanları
18
Rust'ta hata yönetimi, "beklenmedik bir durum olduğunda programın çökmesi" ile "beklenen bir sorunun zarifçe yönetilmesi" arasında net bir çizgi çeker. Rust'ta istisnalar (exceptions) yoktur; bunun yerine iki ana mekanizma vardır: panic! ve Result.

1. panic!: Geri Dönülemez Hatalar​

panic! makrosu, programın devam edemeyeceği kadar kritik bir hata oluştuğunda kullanılır (Örn: Geçersiz bir bellek dizinine erişim veya kritik bir dosyanın eksikliği).
  • Ne yapar? Hata mesajını yazdırır, belleği temizler (unwinding) ve programı sonlandırır.
  • Ne zaman kullanılır? Programın mantıksal olarak ilerleyemeyeceği "çıkmaz sokaklarda".
Rust
Kod:
fn main() {
    panic!("Kritik hata: Yakıt tükendi!");
    // Bu satırdan sonrası asla çalışmaz.
}

2. Result<T, E>: Kurtarılabilir Hatalar​

Rust'ın kalbindeki hata yönetimi budur. Bir işlemin başarılı (Ok) veya başarısız (Err) olabileceğini ifade eden bir enum yapısıdır.
Rust
Kod:
enum Result<T, E> {
    Ok(T),  // Başarı durumunda dönen veri
    Err(E), // Hata durumunda dönen hata bilgisi
}

Örnek: Dosya Okuma​

Rust
Kod:
use std::fs::File;

fn main() {
    let dosya_sonucu = File::open("ayarlar.txt");

    let _dosya = match dosya_sonucu {
        Ok(dosya) => dosya,
        Err(hata) => panic!("Dosya açılamadı: {:?}", hata),
    };
}

3. Hata Yönetimini Kısaltan Araçlar: unwrap ve expect​

Sürekli match yazmak yorucu olabilir. Eğer bir işlemin başarısız olması durumunda programın çökmesinde sakınca yoksa şu metotlar kullanılır:
  • .unwrap(): Eğer sonuç Ok ise içindeki değeri verir, Err ise panic! oluşturur.
  • .expect("Mesaj"): unwrap ile aynıdır ancak hata durumunda sizin belirlediğiniz özel mesajı gösterir (Hata ayıklama için daha iyidir).
Rust
Kod:
let sayi: i32 = "42".parse().expect("Lütfen geçerli bir sayı girin!");

4. Hatanın Yayılması (Error Propagation) ve ? Operatörü​

Bir fonksiyonda hata oluştuğunda, bu hatayı fonksiyonda çözmek yerine çağıran yere geri göndermek isteyebilirsiniz. Bunun için en modern ve şık yöntem ? operatörüdür.
Rust
Kod:
use std::fs::File;
use std::io::{self, Read};

fn kullanıcı_adı_oku() -> Result<String, io::Error> {
    let mut s = String::new();
    
    // Eğer open veya read_to_string hata verirse, fonksiyon 
    // anında Err döner. Başarılı olursa değer 's' içine akar.
    File::open("hello.txt")?.read_to_string(&mut s)?;
    
    Ok(s)
}

Özet: Hangi Hatayı Seçmeli?​

DurumMekanizmaYaklaşım
Kritik / Mantıksal Hatapanic!Programı durdur.
Beklenen SorunlarResult<T, E>Hatayı döndür ve yönetilmesini sağla.
Hızlı Prototipleme.unwrap()Şimdilik çalışsın, sonra düzelteceğim.
Üretim (Production)? OperatörüHataları hiyerarşik olarak yukarı ilet.
 
Geri
Üst