myutil/
error.rs

1/// 打印 eyre error 和 panic 时,美化输出
2/// 
3/// 打印调用栈时,只打印以`package_name`开头的记录,如果`package_name=""`则打印全部
4/// 
5/// # Example
6/// ```
7/// let err = eyre::eyre!("error: test");
8/// panic!("1 {err}");
9/// panic!("2 {err:?}");
10/// panic!("3 {err:#}");
11/// panic!("4 {err:#?}");
12/// ```
13pub fn init_error_hook(package_name: &'static str) {
14    // color_eyre::install().unwrap();
15    color_eyre::config::HookBuilder::default()
16        .add_frame_filter(Box::new(move |frames| {
17            let filters = &[package_name];
18
19            //过滤调用栈
20            frames.retain(|frame| {
21                // tracing::debug!("{}", frame.name.as_ref().unwrap());
22
23                filters.iter().any(|filter| {
24                    if let Some(name) = frame.name.as_ref() {
25                        let name = name.as_str();
26                        name.starts_with(filter)
27                    } else {
28                        true
29                    }
30                })
31            });
32        }))
33        .display_location_section(false) //表示在错误报告中是否显示错误发生的具体代码位置信息,这不会禁用紧急消息中的位置部分。
34        .display_env_section(false) //表示在错误报告中是否显示环境信息部分。
35        .install()
36        .expect("Failed to initialize color_eyre");
37}
38
39#[cfg(test)]
40mod tests {
41    use eyre::{Report, Result, WrapErr};
42    use crate::error::*;
43
44    /// 在Rust中,如果你想要在`println!`宏中输出花括号字符"{}",你可以使用双花括号"{{"和"}}"来转义它们。这是因为在`println!`宏中,花括号"{}"用于格式化输出,而"{"和"}"被认为是特殊字符。因此,如果你想要输出花括号字符本身,你需要将它们用双花括号包裹起来,如下所示:
45    ///
46    /// ```rust
47    /// fn main() {
48    ///     println!("Hello, {{}}"); // 输出: Hello, {}
49    /// }
50    /// ```
51    ///
52    /// 这样做会使得`println!`宏输出的文本中包含实际的花括号字符"{}",而不会被解释为格式化输出的一部分。
53    fn print_error(err: &Report) {
54        println!("{{err}} >> {err}");
55        println!("{{err:?}} >> {err:?}");
56        println!("{{err:#}} >> {err:#}");
57        println!("{{err:#?}} >> {err:#?}");
58    }
59
60    fn my_err() -> Report {
61        let err = || -> Result<()> {
62            Err(eyre::eyre!("error: my error 1"))
63        }().context("my error 2").context("my error 3").unwrap_err();
64
65        err
66    }
67
68    #[test]
69    fn error_no_hook_test() {
70        let err = my_err();
71        print_error(&err);
72        panic!("panic: {err:?}");
73    }
74
75    #[test]
76    fn error_hook_test() {
77        let package_name = "myutil";
78        init_error_hook(package_name);
79
80        let err = my_err();
81        print_error(&err);
82        panic!("panic: {err:?}");
83    }
84}