【问题标题】:rust std::time::SystemTime::elapsed() error conversion to stringrust std::time::SystemTime::elapsed() 错误转换为字符串
【发布时间】:2020-07-18 17:37:48
【问题描述】:

鉴于过去的 std::time::SystemTime,我想通过以下方式在方法中操作 elapsed():

fn render(&self) -> Result<(), String> {
...
let elapsed = self.start.elapsed()?.as_secs();
...
}

然而,?运算符想要将 std::time::SystemTimeError 转换为字符串,而 std::time::SystemTimeError 的 From 不提供这样的转换。不幸的是,您似乎不能:

impl From<std::time::SystemTimeError> for std::time::SystemTimeError {
fn from(e: std::time::SystemTimeError) -> Self { ... }
}

我真的不想添加匹配来处理这个问题,我也不想简单地 unwrap() 而不进行错误检查。我可以定义一个包含匹配项并返回 Result<:time::duration string> 的 fn,但这似乎是错误的。我错过了什么?

更新: 在搞砸了很多次之后;是的,我真的很喜欢。添加 SystemTimeError 轻而易举。但是,我花了一段时间才弄清楚如何处理从另一个 crate 返回的错误(它们是 Result。我终于发现我只需要在我的 Error 枚举中添加一个 GenericError 然后为 Error 实现 std::convert::From 以创建 GenericError。

【问题讨论】:

  • 您最好使结果类型更通用,而不是尝试将错误转换为String
  • 错误类型一般实现显示,所有实现显示的都实现ToString。
  • 我使用 Result 是因为使用了实现许多返回 Result 的方法的板条箱(未显示对板条箱的调用)。我应该在这里引入一个新的 trait 还是泛型来处理 String 和 std::time::SystemTimeError,我遇到的下一个案例该怎么办?似乎 From 旨在处理此问题,而我只是缺少一些东西-我是个生锈的菜鸟。
  • 如果你想要干净的错误句柄,我建议你 crates.io/crates/snafu
  • snafu 似乎确实提供了解决方案。我担心它的重量——但很可能是我,只是还没有与生锈融为一体。

标签: rust


【解决方案1】:

大多数人(包括我自己)会建议不要将StringResult 一起使用,因为这样可能会丢失错误信息。然而,我不认为这就是全部。对于你的例子,你可以使用古老的map_err

let elapsed = self.start.elapsed().map_err(|e|
   e.to_string()
)?;

Andrew Gallant 所详述。如果要包含完整的 Error 对象, 你可以这样做:

let elapsed = self.start.elapsed().map_err(|e|
   format!("{:?}", e)
)?;

或者,根据情况您可能可以avoid both 结果和 恐慌:

let elapsed = self.start.elapsed().unwrap_or_default();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2021-10-12
    • 2018-09-23
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多