
对std::io::Error总结一下:
封装其内部表示,并通过对较大的枚举变量进行 boxing 来优化,
通过ErrorKind模式提供一种便利的方式来基于类别处理错误,
如果有的话,可以完全暴露底层操作系统的错误。
可以透明地包装(wrap)任意其他的错误类型。
最后一点意味着,io::Error可以被用于ad-hoc[6]错误,因为&str和 String 可以转为Box:
io::Error::new(io::ErrorKind::Other, "something went wrong")
它还可以被用于anyhow[7]的简单替换。我认为一些库可能会通过下面这种方式简化其错误处理:
io::Error::new(io::ErrorKind::InvalidData, my_specific_error)
例如,serde_json[8]提供下面的方式:
fn from_reader(rdr: R) -> Result
where
R: Read,
T: DeserializeOwned,
Read会 fail,并带有io::Error,所以serde_json::Error需要能够表示io::Error。我认为这是倒退(但是我不了解完整的背景,如果我被证明是错的,那我会很高兴),并且签名应该是下面这样(下帖)