【发布时间】: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