1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
use std::sync::atomic::{AtomicBool, Ordering}; static PANIC_CAPTURE: AtomicBool = AtomicBool::new(false); pub fn is_panic() -> bool { PANIC_CAPTURE.load(Ordering::SeqCst) } pub fn panic_notify() { std::panic::set_hook(Box::new(|panic_info| { PANIC_CAPTURE.store(true, Ordering::SeqCst); eprintln!( "thread: {:?}\npanic_info: {:?}\nbacktrace: \n{:?}", std::thread::current().name(), panic_info, backtrace::Backtrace::new() ); if let Some(s) = panic_info.payload().downcast_ref::<&str>() { eprintln!("panic occurred: {:?}", s); } else { eprintln!("panic occurred:"); } if let Some(location) = panic_info.location() { eprintln!( "panic occurred in file '{}' at line {}", location.file(), location.line() ); } else { eprintln!("panic occurred but can't get location information..."); } })); }