gpt4 book ai didi

error-handling - 为什么 Rust 编译器不使用 From 特性将库错误转换为我的错误?

转载 作者:行者123 更新时间:2023-11-29 08:26:46 28 4
gpt4 key购买 nike

鉴于这个 crate 引用了另一个 crate 的错误,我通常会写一个 From转换类型的实现。

use xladd::variant::{Variant, XLAddError};
use failure::Fail;
use std::convert::TryInto;
use std::convert::From;
use std::error::Error;

#[derive(Debug, Fail)]
enum AARCError {
#[fail(display = "F64 Conversion failure")]
ExcelF64ConversionError,
#[fail(display = "Bool Conversion failure")]
ExcelBoolConversionError,
#[fail(display = "Conversion failure")]
ExcelStrConversionError,
}

impl From<XLAddError> for AARCError {
fn from(err: XLAddError) -> Self {
AARCError::ExcelF64ConversionError // Test for now
}
}

pub fn normalize(array: Variant, min: Variant, max: Variant, scale: Variant) -> Result<Variant, AARCError> {
let min: f64 = min.try_into().map_err(|e| AARCError::from(e))?;
Ok(Variant::from_str("foo"))
}

但在这种情况下我得到一个错误:

error[E0277]: the trait bound `basic_stats::AARCError: std::convert::From<!>` is not satisfied
--> src\basic_stats.rs:24:48
|
24 | let min: f64 = min.try_into().map_err(|e| AARCError::from(e))?;
| ^^^^^^^^^^^^^^^ the trait `std::convert::From<!>` is not implemented for `basic_stats::AARCError`
|
= help: the following implementations were found:
<basic_stats::AARCError as std::convert::From<xladd::variant::XLAddError>>
= note: required by `std::convert::From::from`

我不明白 From<!> 是什么意思trait 是并且尝试实现类似的东西会给未命名类型带来错误。

我应该怎么做才能让 Rust 将外部 crate 的错误转换为我的错误?

最佳答案

I don't understand what the From<!> trait is and trying to implement something like that gives an error for unnamed types.

!"never"无人居住类型;没有可能值的类型。

如果 Result!对于它的错误类型,这意味着操作不会失败。不可能将其转换为其他错误类型,因为错误值一开始就不可能存在。

never 类型目前是一项实验性功能,需要每晚构建 Rust。因此,它可能有一些粗糙的边缘,并且不像它应该的那样符合人体工程学。例如,我希望最终功能提供一揽子 From<T>所有实现 TryFrom<T> 的类型的实现与关联类型 Error = ! .不必处理不可能发生的错误应该很容易。

要解决您眼前的问题,您可以将该错误映射到 unreachable!() .这种方法的唯一问题是前向兼容性——如果第三方 crate 后来引入了一个可到达的错误,那么你的代码将有一个未处理的错误,并且没有编译时错误来保护你。这可能是为什么 ! 的部分原因尚未稳定。

关于error-handling - 为什么 Rust 编译器不使用 From 特性将库错误转换为我的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53462653/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com