#error #error-handling #macro #simple #handling

no-std error_mapper

在所有项目中简单且标准地处理结果和错误

14个版本

0.3.11 2024年8月19日
0.3.10 2024年8月16日
0.3.9 2023年12月29日
0.3.8 2023年10月7日
0.2.6 2023年9月14日

99配置

Download history 1/week @ 2024-06-27 55/week @ 2024-07-04 14/week @ 2024-07-25 2/week @ 2024-08-01 293/week @ 2024-08-15

每月309次下载

MIT 协议

59KB
1.5K SLoC

error_mapper crate

一个小型crate,可以更轻松地处理错误和结果。只需将其包含在依赖项部分,并使用最新版本,然后启用包含来自不同crate的映射错误的功能。

当前支持以下crate的错误映射

功能

此crate的功能由支持的外部crate决定。如果您想使用tokio的映射,例如,添加功能 "tokio",与 chrono 相同,或您想映射的任何其他crate。默认情况下加载的唯一错误支持且无法禁用的是std Rust错误的支持。

要仅使用函数和TheResult类型,请在没有功能的依赖项中添加,要包括每个可用crate的映射,请使用 full 功能。

主要数据类型

结果枚举是一个自定义的 TheResult 类型,它是 Result<T, TheError> 的别名,其中TheError是一个包含以下成员的构造型

pub struct TheError {
    pub error: TheErrorType,
    pub file: String,
    pub location: (u32, u32),
    pub datestamp: NaiveDate,
    pub timestamp: NaiveTime
}

错误成员类型为 TheErrorType 的结构体包含

pub struct TheErrorType {
    pub error_type: SystemErrorCodes,
    pub error_content: String,
}

SystemErrorCodes 是一个枚举类型,包含所有可能的错误类型,精度较高。随着更多crate被添加到 error_mapper,它还将不断增长。

此crate为其所有错误数据类型实现了 std::fmt::Display 特性。完整显示的错误输出结果将类似于以下示例

GenericError:这是创建的错误!!

首先显示发生错误的文件,然后是行号和列号。接下来显示的是本地时区的错误日期和时间(为了记录日期和时间,使用 Utc::now())。箭头右侧将显示错误类型,冒号之后是错误消息。此消息直接来自crate,它在这里被重映射,但其内容未修改,这意味着如果您遇到mysql_async等crate的连接错误,该crate返回的错误消息将被重定向到您的输出。

用法示例

使用 error_mapper 非常简单。为了演示它,我们将使用一个连接到MySQL数据库的错误示例,使用 mysql_async crate

async fn example_fn() -> TheResult<Conn> {

    //  This macro will map any of the supported crates' error to The Error
    let pool = match Pool::from_url(EnvironmentConfig::instance().get_db_url().await) {
        Ok(pool) => pool,
        Err(e) => {
            return Err(map_to_new_error!(e))
        }
    };

    //  This second macro will enable you to create a new error with a custom message and 
    // an error type, in case you don't have any error to map or is not convenient to do so
    match pool.get_conn().await {
        Ok(conn) => Ok(conn),
        Err(e) => {
            Err(
                create_new_error!(
                    SystemErrorCodes::DbConnectionError, 
                    "Failed to connect to database"
                )
            );
        }
    }
    
    //  Alternatively, this macro allows another variant that only receives an error message.
    // The error type in this case, will be defined as SystemErrorCodes::GenericError
    match pool.get_conn().await {
        Ok(conn) => Ok(conn),
        Err(e) => {
            Err(create_new_error!("Failed to connect to database"));
        }
    }
}

pool变量表示尝试联系数据库时返回的连接池,如果失败,将返回 mysql_async::Error 错误类型。

由于我们不想处理这种特定的错误类型,我们将使用 map_to_new_error! 宏来处理一种通用且简单的错误类型,它实际上保留所有原始信息,并添加一些新的重要和有用的数据,例如错误的日期、时间和文件位置。

example_fn() 的调用函数将接收一个 TheError 类型的错误,它封装在 TheResult 类型中。由于 TheResult 类型是Rust内置的枚举 core::Result 的别名,您可以传播错误以控制执行流程,并在失败时在其他地方处理它。

现在,先前的示例指令包含在异步函数 get_conn() 中,然后您可以从我们的 example_fn() 中调用它,并在失败时传播错误,但如果没有失败,则继续正常执行。

async fn example_fn() -> TheResult<Conn> {

    let conn = get_conn().await?;
    
    Ok(conn)
}

依赖项

~25–40MB
~738K SLoC