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 在 配置
每月309次下载
59KB
1.5K SLoC
error_mapper crate
一个小型crate,可以更轻松地处理错误和结果。只需将其包含在依赖项部分,并使用最新版本,然后启用包含来自不同crate的映射错误的功能。
当前支持以下crate的错误映射
- std Rust错误(Windows OS上的rustc v1.72.0),标准库和核心库
- mysql_async (v0.32.2) -> https://crates.io/crates/mysql_async/0.32.2
- chrono (v0.4.26) -> https://crates.io/crates/chrono/0.4.26
- tokio (v1.29.1) -> https://crates.io/crates/tokio/1.29.1
- actix-web (v4.4.0) -> https://crates.io/crates/actix-web/4.4.0
- reqwest (v0.11.20) -> https://crates.io/crates/reqwest/0.11.20
- serde (v1.0.188) -> https://crates.io/crates/serde/1.0.188
- serde_json (v1.0.107) -> https://crates.io/crates/serde_json/1.0.107
功能
此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