今天看到这个crate想起很久之前我也给golang做过一个类似的库😄

hook panic的

用法也很简单:

  1. cargo add human-panic
  1. [dependencies]
  2. human-panic = "1.0.3"
  1. use human_panic::setup_panic;
  2. fn main() {
  3. setup_panic!();
  4. println!("A normal log message");
  5. panic!("OMG EVERYTHING IS ON FIRE!!!")
  6. }

看看啥原理?

点进setup_panic!宏看看。

  1. #[allow(unused_imports)]
  2. use std::panic::{self, PanicInfo};
  3. #[allow(unused_imports)]
  4. use $crate::{handle_dump, print_msg, Metadata};
  5. #[cfg(not(debug_assertions))]
  6. match ::std::env::var("RUST_BACKTRACE") {
  7. Err(_) => {
  8. let meta = Metadata {
  9. version: env!("CARGO_PKG_VERSION").into(),
  10. name: env!("CARGO_PKG_NAME").into(),
  11. authors: env!("CARGO_PKG_AUTHORS").replace(":", ", ").into(),
  12. homepage: env!("CARGO_PKG_HOMEPAGE").into(),
  13. };
  14. panic::set_hook(Box::new(move |info: &PanicInfo| {
  15. let file_path = handle_dump(&meta, info);
  16. print_msg(file_path, &meta)
  17. .expect("human-panic: printing error message to console failed");
  18. }));
  19. }
  20. Ok(_) => {}
  21. }

原来std标准库本来就支持 hook啊,没什么黑科技😅。那没事了

  1. use std::panic::PanicInfo;
  2. fn main() {
  3. // setup_panic!();
  4. std::panic::set_hook(Box::new(move |info: &PanicInfo| {
  5. println!("this is panic {:?}",info);
  6. }));
  7. println!("A normal log message");
  8. panic!("OMG EVERYTHING IS ON FIRE!!!")
  9. }