rust - 如何使返回 XMLError 的方法与 anyhow::Error 兼容?

标签 rust xml-builder anyhow

这是我的代码(来自 xml-builderXMLElement ):

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出于同样的原因,这种方法也不起作用。

解决这个问题的一些可能的方法:

  1. 使用新类型模式。创建一个新的struct MyXMLError(XMLError)然后执行 StdError 那个的特征。同时实现From<XMLError>适合您的新类型,以便更符合人体工程学地工作。
  2. 定义一堆新的错误类型(可能通过 thiserror ),这些类型更适合代码的用户,而不是像 xml-builder 这样的底层库。东西。让这些错误类型实现StdError根据需要类型 XLMError 键入并创建它们你发现。

关于rust - 如何使返回 XMLError 的方法与 anyhow::Error 兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75779835/

相关文章:

rust - 当我可以绑定(bind)可变变量时,为什么还需要重新绑定(bind)/隐藏?

module - 如何从特定模块创建所有装饰函数的向量?

types - 如何比较 Rust 中拥有的向量和静态向量的内容?

generics - 有没有办法为智能指针中的对象通用地实现一个特征?

ruby-on-rails - Rails xml-builder 自定义命名空间删除空格

java - 在java中将平面文件记录转换为xml

xml - 使用 nodejs 中的 xmlbuilder 在 xml 中添加 namspace

rust - 应用程序的错误处理 : how to return a public message error instead of all the chain of errors and tracing it at the same time?