首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用panic::catch_unwind时抑制锈蚀中的恐慌输出

使用panic::catch_unwind时抑制锈蚀中的恐慌输出
EN

Stack Overflow用户
提问于 2016-02-22 16:51:49
回答 3查看 8.7K关注 0票数 31

我用panic::catch_unwind来捕捉恐慌:

代码语言:javascript
复制
use std::panic;

fn main() {
    let result = panic::catch_unwind(|| {
        panic!("test panic");
    });

    match result {
        Ok(res) => res,
        Err(_) => println!("caught panic!"),
    }
}

(游乐场)

这似乎工作得很好,但我仍然得到了恐慌的输出。我想这个只打印出来:

代码语言:javascript
复制
caught panic!

而不是

代码语言:javascript
复制
thread '<main>' panicked at 'test panic', <anon>:6
note: Run with `RUST_BACKTRACE=1` for a backtrace.
caught panic!
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-22 16:58:00

您需要向std::panic::set_hook注册一个恐慌钩子,它什么也不做。然后,您可以使用std::panic::catch_unwind捕获它。

代码语言:javascript
复制
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获取当前挂钩,以便在需要时恢复它。

另请参阅:

票数 34
EN

Stack Overflow用户

发布于 2019-12-06 10:39:32

使用下面的catch_unwind_silent而不是常规的catch_unwind来实现对预期异常的沉默:

代码语言:javascript
复制
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
}
票数 7
EN

Stack Overflow用户

发布于 2017-11-29 18:51:33

您可以使用std::panic::set_hook来抑制输出。但是,请注意,钩子是进程全局的,它将抑制程序中可能发生的所有恐慌的报告。

正如我在回答类似问题时已经提到的堵住一样,我已经编写了一个板条箱,它提供了一种使用可组合过滤器来抑制钩子的方法,包括一个基于每个线程的过滤器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35559267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档