-
Sadrazamv4
ig:sadrazam_v4 tg: Sadrazam.spy
🚀 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:
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:
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:
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:
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! 🦀✨
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:
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:
### 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:
---
❓ 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:
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