我在单独的线程中运行一些代码:
fn f1() -> Result<(), String> { Err("err1".to_string()) }
fn f2() -> Result<(), String> { Err("err2".to_string()) }
::std::thread::spawn(move || {
f1().expect("f1 failed");
f2().expect("f2 failed");
});
Run Code Online (Sandbox Code Playgroud)
我也用日志箱进行日志记录。
结果我想要panic!打电话error!而不是print!。
我找到了恐慌钩子,但我不喜欢unwrap这样的代码:
panic::set_hook(Box::new(|panic_info| {
error!("panic occured: {:?}", panic_info.payload().downcast_ref::<&str>().unwrap());
}));
Run Code Online (Sandbox Code Playgroud)
我担心:
这通常(但并非总是)是
&'static str或String
但不会downcast总是成功吗?
这通常(但并非总是)是
&'static str或String
这意味着开发人员(您使用的库的开发人员)可能会使用另一种类型。在这种情况下,调用downcast_ref将会失败。
我的建议是处理您了解的情况并添加带有默认消息的包罗万象的情况。
此外,您还应该考虑打印位置,因为即使没有消息,它也非常有用。
总而言之:
use std::panic;
use std::ops::Deref;
panic::set_hook(Box::new(|panic_info| {
let (filename, line) =
panic_info.location().map(|loc| (loc.file(), loc.line()))
.unwrap_or(("<unknown>", 0));
let cause = panic_info.payload().downcast_ref::<String>().map(String::deref);
let cause = cause.unwrap_or_else(||
panic_info.payload().downcast_ref::<&str>().map(|s| *s)
.unwrap_or("<cause unknown>")
);
error!("A panic occurred at {}:{}: {}", filename, line, cause);
}));
Run Code Online (Sandbox Code Playgroud)
让我们打开它:
payload是 a String,如果是则取消引用它,&str,如果不是则提供默认值,| 归档时间: |
|
| 查看次数: |
1282 次 |
| 最近记录: |