rust 在错误类型中,#[error(...)]行做什么?[duplicate]

lzfw57am  于 2023-03-23  发布在  其他
关注(0)|答案(2)|浏览(151)

此问题在此处已有答案

Reuse error message from thiserror definition(1个答案)
17小时前关门了。
我目前正在使用官方的mongodb驱动程序进行rust,在查看mongodb的错误类型时,我在mongodb::error::Error实现中遇到了这一行:

#[error("Kind: {kind}, labels: {labels:?}")]

这一行是什么意思?它给结构体增加了什么功能?
mongodb::error::Error结构定义如下:

use thiserror::Error;

#[derive(Clone, Debug, Error)]
#[error("Kind: {kind}, labels: {labels:?}")]
#[non_exhaustive]
pub struct Error {
    /// The type of error that occurred.
    pub kind: Box<ErrorKind>,
    labels: HashSet<String>,
    pub(crate) wire_version: Option<i32>,
    #[source]
    pub(crate) source: Option<Box<Error>>,
}

来源:这里

g6ll5ycj

g6ll5ycj1#

这是thiserrorerror message 属性。它们使你能够用比手工更简单的方式构造std::error::Error trait的自定义消息的实现。你可以在链接行的上方看到Error派生宏是在第11行导入的。
链接的示例将属性宏应用于结构类型,但它也可以用于枚举变体。可以从文档本身看到使用此派生宏的另一个示例。

use thiserror::Error;

#[derive(Error, Debug)]
pub enum DataStoreError {
    #[error("data store disconnected")]
    Disconnect(#[from] io::Error),
    #[error("the data for key `{0}` is not available")]
    Redaction(String),
    #[error("invalid header (expected {expected:?}, found {found:?})")]
    InvalidHeader {
        expected: String,
        found: String,
    },
    #[error("unknown data store error")]
    Unknown,
}

另见:

lqfhib0f

lqfhib0f2#

线#[error("Kind: {kind}, labels: {labels:?}")]是影响上一行#[derive(Error)]的参数。
它指定如何打印错误;具体来说,它为结构体实现了Display
参见this example

use thiserror::Error;
use std::collections::HashSet;

#[derive(Clone, Debug, Error)]
#[error("Kind: {kind}, labels: {labels:?}")]
#[non_exhaustive]
pub struct Error {
    kind: String,
    labels: HashSet<String>,
}

fn main() {
    let my_error = Error {
        kind: "SpecialKind".to_string(),
        labels: HashSet::from([
            "xyz".to_string(),
            "aaa".to_string()
        ])
    };
    
    println!("{}", my_error);
}
Kind: SpecialKind, labels: {"xyz", "aaa"}

相关问题