今天看到这个crate想起很久之前我也给golang做过一个类似的库😄
hook panic的
用法也很简单:
cargo add human-panic
[dependencies]human-panic = "1.0.3"
use human_panic::setup_panic;fn main() {setup_panic!();println!("A normal log message");panic!("OMG EVERYTHING IS ON FIRE!!!")}
看看啥原理?
点进setup_panic!宏看看。
#[allow(unused_imports)]use std::panic::{self, PanicInfo};#[allow(unused_imports)]use $crate::{handle_dump, print_msg, Metadata};#[cfg(not(debug_assertions))]match ::std::env::var("RUST_BACKTRACE") {Err(_) => {let meta = Metadata {version: env!("CARGO_PKG_VERSION").into(),name: env!("CARGO_PKG_NAME").into(),authors: env!("CARGO_PKG_AUTHORS").replace(":", ", ").into(),homepage: env!("CARGO_PKG_HOMEPAGE").into(),};panic::set_hook(Box::new(move |info: &PanicInfo| {let file_path = handle_dump(&meta, info);print_msg(file_path, &meta).expect("human-panic: printing error message to console failed");}));}Ok(_) => {}}
原来std标准库本来就支持 hook啊,没什么黑科技😅。那没事了
use std::panic::PanicInfo;fn main() {// setup_panic!();std::panic::set_hook(Box::new(move |info: &PanicInfo| {println!("this is panic {:?}",info);}));println!("A normal log message");panic!("OMG EVERYTHING IS ON FIRE!!!")}
