今天看到这个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!!!")
}