我有一个隐含该Error特征的错误类型,它包装了一个潜在的错误原因,因此该source方法返回Some(source). 我想知道Display我的错误类型的 impl 是否应该包含该源错误的描述。
我可以看到两个选项:
source在Display输出中,例如“打开数据库时出错:没有这样的文件”这使得只需通过格式化即可轻松打印整个错误链,"{}"但不可能仅显示错误本身而不显示底层源错误链。它还使该source方法有点毫无意义,并且使客户端代码无法选择如何格式化链中每个错误之间的分隔。然而,在我发现的示例代码中,这种选择似乎很常见。
source如果客户端代码希望将其包含在输出中)。这使客户端代码可以选择是否仅显示表面错误或整个链,以及在后一种情况下如何格式化链中每个错误之间的分隔。它给客户端代码留下了遍历链的负担,而且我还没有找到一个规范的实用程序来方便地格式化错误链,其中每个错误都只Display自己排除source。(所以我当然有自己的。)
混乱的箱子(我真的很喜欢)似乎暗示有利于选项 2,因为带有字段source但没有display属性的错误变体默认为格式化Display不包含source.
也许我真正的问题是:该方法的目的是什么source?是为了让格式化错误链更加灵活吗?或者Display真的应该输出用户可见的有关错误的所有内容,并且source仅用于开发人员可见的目的?
我希望看到一些关于此的明确指导,最好是在该Error特征的文档中。
#[derive(Debug)]
enum DatabaseError {
Opening { source: io::Error },
}
impl Error for DatabaseError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
match self {
DataBaseError::Opening { source …Run Code Online (Sandbox Code Playgroud)