Rust
Panic handler
#[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.
Örnek çözümü göster
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);
}
}
Kendini test et
-
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
- Gelenek
Cevabı göster
Panic'ten sonra kaldığı yerden devam edilemez; işleyici hiç dönmemelidir — ! (never) türü "bu fonksiyon dönmez" demektir; sonsuz döngü, sıfırlama ya da abort olmalıdır.
-
Panic'i yakala
let sonuc = std::panic::____(|| {
panic!("sıfıra bölme");
});
Cevabı göster
let sonuc = std::panic::catch_unwind(|| {
panic!("sıfıra bölme");
});
-
Araç ve ortamı
- #[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
Sıradaki ders: Özet - no_std ve gömülü