🚀 BAŞTAN SONA RUST DİLİ BÖLÜM-8: Hata Yönetimi (Error Handling) ve Result Tipi ⚠️

Konu Özeti

Rust'ta hata yönetimi, kurtarılamaz hatalar için panic! makrosu ve kurtarılabilir hatalar için Result tipi ile ele alınır. panic! programı anında durdururken, Result başarı (Ok) veya hata (Err) durumlarını temsil eder. Result ile hata yönetiminde match, unwrap, expect ve ? operatörü gibi yöntemler kullanılarak güvenli ve okunabilir kod yazılması sağlanır.

🚀 BAŞTAN SONA RUST DİLİ BÖLÜM-8: Hata Yönetimi (Error Handling) ve Result Tipi ⚠️

Selamlar! Serimizin 8. bölümüne hoş geldiniz.

Önceki bölümde Enum yapılarını, `Option<T>` tipini ve `match` pattern matching mekanizmasını incelemiştik. Bu bölümde ise Rust’ın güvenilirlik felsefesinin kalbinde yer alan **Hata Yönetimi (Error Handling)** konusuna geçiyoruz.

Rust, hataları iki ana kategoriye ayırır:
1. **Kurtarılamaz Hatalar (Unrecoverable Errors):** Programın devam edemeyeceği kritik durumlar (`panic!`).
2. **Kurtarılabilir Hatalar (Recoverable Errors):** Dosya bulunamaması veya ağ bağlantısı kopması gibi yönetilebilir durumlar (`Result<T, E>`).

---

💥 1. Kurtarılamaz Hatalar: `panic!` 🚨

Kurtarılamaz bir hata oluştuğunda program çalışmayı anında durdurur, belleği temizler ve geriye bir hata mesajı basar.

`panic!` makrosunu doğrudan kendimiz çağırabileceğimiz gibi, sınır dışı indeks erişimi gibi durumlarda Rust bunu otomatik olarak tetikler:

fn main() {
// Doğrudan panic tetikleme
// panic!("Kritik sistem hatası! Program kapatılıyor.");

let v = vec![1, 2, 3];
v[99]; // <-- Çalışma zamanında panic! verir (buffer over-read engellenir)
}

---

🛡️ 2. Kurtarılabilir Hatalar: `Result<T, E>` Enum'ı 🔄

Birçok dilde hatalar `try-catch` blokları ile yönetilir. Rust'ta ise `try-catch` YOKTUR! Bunun yerine geriye bir `Result` Enum'ı döndürülür:

enum Result<T, E> {
Ok(T), // İşlem başarılı, T tipinde veriyi tutar
Err(E), // İşlem başarısız, E tipinde hatayı tutar
}

Örnek: Dosya açma işlemi:

use std::fs::File;

fn main() {
let dosya_sonucu = File::eek:pen("notlar.txt");

let dosya = match dosya_sonucu {
Ok(f) => f,
Err(hata) => panic!("Dosya açılırken hata oluştu: {:?}", hata),
};
}

---

🛠️ 3. Pratik Hata Ele Alma: `unwrap` ve `expect` 🎯

Her defasında `match` yazmak yerine hızlıca hata kontrolü yapmak için kestirme metotlar vardır:

### A. `unwrap()`
İşlem `Ok` ise içindeki veriyi döner. Eğer `Err` ise programı anında `panic!` ile patlatır.

let f = File::eek:pen("notlar.txt").unwrap();

### B. `expect("Özel Hata Mesajı")`
`unwrap` ile aynıdır ancak `panic!` verdiğinde kendi belirttiğiniz hata mesajını ekrana basar. Production kodlarında `unwrap` yerine `expect` veya `match` tercih edilmelidir!

let f = File::eek:pen("notlar.txt").expect("notlar.txt dosyası dizinde bulunamadı!");

---

❓ 4. Hata Yayma Operatörü: `?` (Question Mark) 🚀

Bir fonksiyonda hata oluştuğunda, hatayı o an çözmek yerine fonksiyonu çağıran üst mekanizmaya fırlatmak (propagating errors) isteyebiliriz.

`?` operatörü tam olarak bunu yapar:
• İşlem `Ok` ise içindeki veriyi çıkarır ve koda devam eder.
• İşlem `Err` ise fonksiyonun çalışmasını durdurur ve `Err` değerini anında fonksiyondan geriye döner!

use std::fs::File;
use std:🇮🇴:{self, Read};

fn dosyadan_metin_oku() -> Result<String, io::Error> {
let mut dosya = File::eek:pen("notlar.txt")?; // Hata varsa burada erken dönüş (return Err) yapar!
let mut icerik = String::new();
dosya.read_to_string(&mut icerik)?; // Hata varsa burada erken dönüş yapar
Ok(icerik) // Başarılıysa Ok(icerik) döner
}

fn main() {
match dosyadan_metin_oku() {
Ok(metin) => println!("Dosya İçeriği:\n{}", metin),
Err(e) => println!("Hata Oluştu: {}", e),
}
}

#### Metot Zincirleme (Method Chaining):
`?` operatörü sayesinde yukarıdaki fonksiyonu tek satırda da yazabiliriz:

use std::fs;

fn kisa_dosya_oku() -> Result<String, io::Error> {
fs::read_to_string("notlar.txt")
}

---

📝 Bölüm Özeti ve Gelecek Bölüm 🔮

Bu bölümde Rust'ın güvenli hata yönetimi felsefesini, `panic!` ve `Result<T, E>` yapılarını, `unwrap`/`expect` metotlarını ve kod okunabilirliğini artıran `?` operatörünü inceledik.

👉 **Bölüm 9'da Bizi Ne Bekliyor?**
• Yaygın Koleksiyonlar (Common Collections):
- Dinamik Diziler: **`Vector` (`Vec<T>`)**
- UTF-8 Metinler: **`String`**
- Key-Value Yapısı: **`HashMap<K, V>`**

Soruları
nızı konu altından iletebilirsiniz. Bir sonraki bölümde görüşmek üzere! 🦀✨

🔒 Bu içeriği görmek için giriş yapın

 
Yanıt yazmak için giriş yapmalısınız
Forum özelliklerini kullanmak ve Level 2 üyelik satın almak için hesabınıza giriş yapın.
136,705Threads
3,307,735Messages
328,555Members
yunus33yunuzLatest member
Top Bottom