Panic handler
- Rust kursu
- Uzman
- Ders 35/46
- 4 dk
#[panic_handler] ile panik yönetmeyi öğrenirsin.
Panic handler
std, panic olduğunda mesajı yazan ve yığını geri saran bir işleyici sağlar. no_std ikili dosyasında bu işleyiciyi sen yazmalısın; tam olarak bir tane olmalıdır ve asla dönmemelidir:
#![no_std]
#![no_main]
use core::panic::PanicInfo;
#[panic_handler]
fn panic(_info: &PanicInfo) -> ! {
loop {} // ya da: LED yak, işlemciyi sıfırla, hata kaydet
}Hazır crate'ler de vardır: panic-halt (dur), panic-reset (yeniden başlat), panic-probe (hata ayıklayıcıya bildir).
std'de panic'i özelleştirmek
Normal programlarda panic davranışı set_hook ile özelleştirilir, catch_unwind ile de bir panic yakalanıp kurtarılabilir (örneğin bir eklentinin çökmesi tüm sunucuyu durdurmasın diye):
std::panic::set_hook(Box::new(|_| {})); // varsayılan mesajı sustur
let sonuc = std::panic::catch_unwind(|| {
panic!("sıfıra bölme");
});
if let Err(e) = sonuc {
let mesaj = e.downcast_ref::<&str>().copied().unwrap_or("?");
println!("yakalandı: {mesaj}");
}catch_unwind bir hata yönetimi aracı değildir; beklenen hatalar Result ile ele alınmalıdır.
Uygulama Panic'ten kurtul
Varsayılan panic mesajını set_hook ile sustur. catch_unwind içinde panic!("sıfıra bölme") çağır, yükü downcast_ref::<&str> ile al ve yakalandı: MESAJ yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
fn main() {
std::panic::set_hook(Box::new(|_| {}));
let sonuc = std::panic::catch_unwind(|| {
panic!("sıfıra bölme");
});
if let Err(e) = sonuc {
let mesaj = e.downcast_ref::<&str>().copied().unwrap_or("?");
println!("yakalandı: {}", mesaj);
}
}Beklenen çıktı
yakalandı: sıfıra bölme
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Neden panic işleyicinin dönüş türü <code>!</code>'dir?
- Hız için
- Hata ayıklama için
- Panic'ten sonra kaldığı yerden devam edilemez; işleyici hiç dönmemelidir Doğru cevap
- Gelenek
Açıklama: ! (never) türü "bu fonksiyon dönmez" demektir; sonsuz döngü, sıfırlama ya da abort olmalıdır.
2 Panic'i yakala
let sonuc = std::panic::____(|| {
panic!("sıfıra bölme");
});
let sonuc = std::panic::catch_unwind(|| {
panic!("sıfıra bölme");
});
Açıklama: catch_unwind, closure'daki panic'i bir Err olarak döndürür.
3 Araç ve ortamı
| Kavram | Anlamı |
|---|---|
#[panic_handler] |
no_std ikili |
set_hook |
std, mesajı özelleştirir |
catch_unwind |
std, panic'i yakalar |
panic-halt |
Hazır no_std işleyici |