8 个版本 (4 个重大更新)
0.4.2 | 2024年5月9日 |
---|---|
0.4.1 | 2023年6月22日 |
0.4.0 | 2023年5月15日 |
0.3.0 | 2022年7月26日 |
0.0.0 | 2020年10月27日 |
#1171 在 数据库接口
每月下载量478
用于 8 个 Crates(5 个直接使用)
32KB
688 行
EdgeDB Rust 绑定:错误包
此包包含从数据库返回的错误定义。
许可证
许可协议为以下之一:
- Apache 许可协议第 2 版(./LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证(./LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
lib.rs
:
EdgeDB 错误处理
EdgeDB Rust 绑定产生的所有错误都封装在 Error
结构中。该结构类似于 Box<dyn Error>
或 anyhow::Error
,但它只能包含 EdgeDB 错误类型。或者可以使用 UserError
来封装自定义错误(通常用于从事务返回错误)。
可以在网站文档中找到 EdgeDB 错误类型的完整列表。
每个错误类型都表示为单独的类型,实现了 ErrorKind
特性。但错误类型被用作标记结构;可以使用 Error::is
来检查错误类型,并使用它们创建错误实例
let err = UserError::with_source(io::Error::from(io::ErrorKind::NotFound));
assert!(err.is::<UserError>());
由于错误是分层的,因此 Error::is
与任何祖先一起使用
assert!(err.is::<MissingArgumentError>());
assert!(err.is::<QueryArgumentError>()); // implied by the assertion above
assert!(err.is::<InterfaceError>()); // and this one
assert!(err.is::<ClientError>()); // and this one
错误层次结构没有多重继承(即每个错误只有一个父级)。当我们在不同的父级之间进行匹配时,我们使用错误标记
assert!(err1.is::<ClientConnectionTimeoutError>());
assert!(err2.is::<TransactionConflictError>());
// Both of these are retried
assert!(err1.has_tag(SHOULD_RETRY));
assert!(err2.has_tag(SHOULD_RETRY));
// But they aren't a part of common hierarchy
assert!(err1.is::<ClientError>());
assert!(!err1.is::<ExecutionError>());
assert!(err2.is::<ExecutionError>());
assert!(!err2.is::<ClientError>());
事务中的错误
在事务中必须对错误给予特别注意。一般来说
- 查询错误不应被忽略,应将其传播到事务函数。
- 用户错误可以通过以下方法封装到
UserError
中:
ErrorKind::with_source
(适用于任何std::error::Error
)ErrorKind::with_source_box
已装箱的错误ErrorKind::with_source_ref
用于智能包装器,如anyhow::Error
- 原始查询错误必须通过错误链传播。它可以在
.source()
链中,但不能被吞没,否则重试事务可能会运行不正确。
错误报告良好
请参阅edgedb-tokio的文档。
依赖关系
~135–415KB