CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
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

Soru
let sonuc = std::panic::____(|| {
    panic!("sıfıra bölme");
});
Cevap
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

Uzman bölümündeki tüm dersler