我有一小段代码,如果函数失败,我想用它来记录错误和死机,但我似乎无法让它工作,因为我得到了"Match Arm Has Compatible Types..."错误.

我知道我应该提供这些值,但有没有办法不这样做,因为我们无论如何都在panic 呢?

或者,或许还有其他办法?我试图记录一个错误,并且仅使用.expect个死机,但没有生成合适的日志(log),或者没有执行我们需要的任何其他工具.

// this is in my instrumentation crate
pub fn handle_error(panic_msg: &str, process: &str, status: &str, error: Box<dyn Error>) {
    event!(Level::ERROR, process=process, status=status, error);
    panic!("{}", panic_msg);
}
fn main() {
   let (val1, val2, val3) = match function_call(user_id).await {
        Ok(x) => x,
        Err(e) => instrumentation::handle_error("panic", "proc", "failed", Box::new((e))),
    };
}

推荐答案

如果您想告诉您的消费者instrumentation::handle_error永远不会返回,您可以通过告诉它的返回类型是!(称为never类型)来表达这一点.可以将此类型强制为任何其他类型.只需将hande_error更改为:

pub fn handle_error(
    panic_msg: &str,
    process: &str,
    status: &str,
    error: Box<dyn Error>,
) -> ! {
    event!(Level::ERROR, process=process, status=status, error);
    panic!("{}", panic_msg)
}

panic 是Rust中发散的一种形式,在类型系统中表示为返回"Never"类型,拼写为!(无限循环也是如此).这将使您的匹配语句编译,您将不必更改任何内容.

Rust相关问答推荐

为什么我们不能通过指针算法将Rust原始指针指向任意地址?'

Tauri tauri—apps/plugin—store + zustand

使用pyo3::Types::PyIterator的无限内存使用量

从Type::new()调用函数

如何点击()迭代器?

如何正确重新排列代码以绕过铁 rust 借入判断器?

在Rust 中移动原始指针的靶子安全吗

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

如何将实现多个特征的 struct 传递给接受这些特征为&;mut?

.在 Rust 模块标识符中

如何将一个矩阵的列分配给另一个矩阵,纳尔代数?

在描述棋盘时如何最好地使用特征与枚举

全面的 Rust Ch.16.2 - 使用捕获和 const 表达式的 struct 模式匹配

没有明确地说return会产生错误:match arms have incompatible types

pyO3 和 Panics

我如何取消转义,在 Rust 中多次转义的字符串?

从 HashMap>, _> 中删除的生命周期问题

为什么 i32 Box 类型可以在 Rust 中向下转换?

为什么会出现无法移出可变引用后面的 `self.x`错误?

从 Cranelift 发出 ASM