rust / expert
Snippet
Abfangen von Thread-Panics mit benutzerdefinierten globalen Panic-Hooks
Bei fortgeschrittenen Tests oder Multithreading-Diagnosen erfasst die Standard-Panic-Behandlung möglicherweise keine ausreichende Kontexttelemetrie oder erhöht keine Metrikzähler. Durch Registrieren eines benutzerdefinierten Panic-Hooks können Sie abstürzende Threads abfangen, Thread-Metadaten aufzeichnen, atomare Diagnosezähler aktualisieren und an die Standard-Panic-Ausgabe anknüpfen.
snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use std::panic;use std::thread;use std::sync::atomic::{AtomicUsize, Ordering};static PANIC_COUNT: AtomicUsize = AtomicUsize::new(0);pub fn setup_diagnostic_panic_hook() {let default_hook = panic::take_hook();panic::set_hook(Box::new(move |panic_info| {PANIC_COUNT.fetch_add(1, Ordering::SeqCst);let thread = thread::current();let thread_name = thread.name().unwrap_or("<unnamed>");eprintln!("Thread '{}' encountered panic. Hook state: {:?}",thread_name, panic_info);default_hook(panic_info);}));}
Erklärung
1
let default_hook = panic::take_hook();
Ruft den aktuellen Panic-Hook-Wrapper ab, sodass der benutzerdefinierte Hook die Ausführung an das Standardverhalten weiterleiten kann.
2
panic::set_hook(Box::new(move |panic_info| {
Registriert eine neue globale Closure als Handler für Thread-Panics über die gesamte Lebensdauer der Anwendung hinweg.
3
PANIC_COUNT.fetch_add(1, Ordering::SeqCst);
Verwendet atomare Ordnung, um den globalen Panic-Tracker threadsicher zu inkrementieren.