我用panic::catch_unwind来捕捉恐慌:
use std::panic;
fn main() {
let result = panic::catch_unwind(|| {
panic!("test panic");
});
match result {
Ok(res) => res,
Err(_) => println!("caught panic!"),
}
}(游乐场)
这似乎工作得很好,但我仍然得到了恐慌的输出。我想这个只打印出来:
caught panic!而不是
thread '<main>' panicked at 'test panic', <anon>:6
note: Run with `RUST_BACKTRACE=1` for a backtrace.
caught panic!发布于 2016-02-22 16:58:00
您需要向std::panic::set_hook注册一个恐慌钩子,它什么也不做。然后,您可以使用std::panic::catch_unwind捕获它。
use std::panic;
fn main() {
panic::set_hook(Box::new(|_info| {
// do nothing
}));
let result = panic::catch_unwind(|| {
panic!("test panic");
});
match result {
Ok(res) => res,
Err(_) => println!("caught panic!"),
}
}作为马蒂厄M.笔记,您可以使用std::panic::take_hook获取当前挂钩,以便在需要时恢复它。
另请参阅:
发布于 2019-12-06 10:39:32
使用下面的catch_unwind_silent而不是常规的catch_unwind来实现对预期异常的沉默:
use std::panic;
fn catch_unwind_silent<F: FnOnce() -> R + panic::UnwindSafe, R>(f: F) -> std::thread::Result<R> {
let prev_hook = panic::take_hook();
panic::set_hook(Box::new(|_| {}));
let result = panic::catch_unwind(f);
panic::set_hook(prev_hook);
result
}发布于 2017-11-29 18:51:33
您可以使用std::panic::set_hook来抑制输出。但是,请注意,钩子是进程全局的,它将抑制程序中可能发生的所有恐慌的报告。
正如我在回答类似问题时已经提到的堵住一样,我已经编写了一个板条箱,它提供了一种使用可组合过滤器来抑制钩子的方法,包括一个基于每个线程的过滤器。
https://stackoverflow.com/questions/35559267
复制相似问题