我用panic::catch_unwind来引起panic :

use std::panic;

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

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

(Playground)

这似乎工作得很好,但我仍在将panic 输出到stdout.我只想把这个打印出来:

caught panic!

而不是

thread '<main>' panicked at 'test panic', <anon>:6
note: Run with `RUST_BACKTRACE=1` for a backtrace.
caught panic!

推荐答案

你需要注册一个panic hookstd::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!"),
    }
}

作为Matthieu M. notes,如果需要的话,可以使用std::panic::take_hook获取当前钩子,以便在以后恢复它.

另见:

Rust相关问答推荐

包含嵌套 struct 的CSV

Arrow RecordBatch as Polars DataFrame

将大小为零的类型实例存储到空指针中

使用Box优化可选的已知长度数组的内存分配

是否可以使用Rust宏来构建元组的项?

关于 map 闭合求和的问题

try 创建随机数以常量

更合理的方法来设计样条线函数器?

正在将带有盒的异步特征迁移到新的异步_fn_in_特征功能

Rust面向对象设计模式

为相同特征的特征对象使用 move 方法实现特征

如何对一个特征的两个实现进行单元测试?

存储返回 impl Trait 作为特征对象的函数

从Rust 的临时文件中创建引用是什么意思?

切片不能被 `usize` 索引?

是否可以在 Rust 中的特定字符上实现特征?

为什么传递 option.as_ref 的行为不同于使用匹配块并将内部映射到 ref 自己?

将 `&T` 转换为新类型 `&N`

当 `T` 没有实现 `Debug` 时替代 `unwrap()`

HashMap entry() 方法使borrow 的时间比预期的长