这是我的代码(来自 xml-builder 的 XMLElement
):
use anyhow::Result;
use xml_builder::XMLElement;
fn foo() -> Result<()> {
let mut v = XMLElement::new("v");
v.add_child(XMLElement::new("e"))?;
Ok(())
}
它无法编译:
error[E0277]: the trait bound `XMLError: StdError` is not satisfied
--> src/xml.rs:78:41
|
78 | v.add_child(XMLElement::new("e"))?;
| ^ the trait `StdError` is not implemented for `XMLError`
|
= help: the following other types implement trait `FromResidual<R>`:
<Result<T, F> as FromResidual<Result<Infallible, E>>>
<Result<T, F> as FromResidual<Yeet<E>>>
= note: required for `anyhow::Error` to implement `From<XMLError>`
= note: required for `Result<std::string::String, anyhow::Error>` to implement `FromResidual<Result<Infallible, XMLError>>`
如何将 XMLError
映射到 anyhow::Error
?我尝试了 .map_err(|e| 总之::Error::new(e))
,但它也不起作用。
最佳答案
来自anyhow
文档:
Anyhow works with any error type that has an impl of std::error::Error, including ones defined in your crate.
不幸的是,XMLError
没有实现该特征,并且由于孤儿规则,您对此无能为力。
所以,anyhow
无法开箱即用。 anyhow::Error::new
出于同样的原因,这种方法也不起作用。
解决这个问题的一些可能的方法:
- 使用新类型模式。创建一个新的
struct MyXMLError(XMLError)
然后执行StdError
那个的特征。同时实现From<XMLError>
适合您的新类型,以便更符合人体工程学地工作。 - 定义一堆新的错误类型(可能通过
thiserror
),这些类型更适合代码的用户,而不是像xml-builder
这样的底层库。东西。让这些错误类型实现StdError
根据需要类型XLMError
键入并创建它们你发现。
关于rust - 如何使返回 XMLError 的方法与 anyhow::Error 兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75779835/