当前位置:  开发笔记 > 编程语言 > 正文

是否存在将多个错误聚合为另一个错误的原因的约定?

如何解决《是否存在将多个错误聚合为另一个错误的原因的约定?》经验,为你挑选了1个好方法。

我正在编写一个迭代向量的函数,Result如果它们都成功则返回成功,如果失败则返回错误.限制error::Error使我感到沮丧,我不知道如何解决它们.目前我有类似的东西:

let mut errors = Vec::new();            

for result in results {                             
     match result {                        
         Err(err) => errors.push(err),
         Ok(success) => { ... }
     }                                                                                                                                      
}

if errors.is_empty() {
    return Ok(())
else {
    return Err(MyErrorType(errors))
}

我目前的做法的问题是,我只能设定一个错误是causeMyErrorType,我的错误的description需求,是一个静态的String,所以我不能包括每个触发故障的说明.所有失败都可能与调用者有关.



1> Matthieu M...:

没有我所知道的惯例,事实上我从未遇到过尝试一次报告多个错误的问题......

......话虽如此,有两点可以帮到你:

    描述没有限制'static String,您可能会感到困惑&'static str&str.在fn description(&self) -> &str,str寿命与self(生命周期省略)的寿命相关联,因此嵌入式String满足约束条件

    Error是一个统一处理错误的接口.在这种情况下,事实上,只有一个单一的cause预见,但它不排除更具体的类型来聚合多种原因,自Error允许向下转换(Error::is,Error::downcast,...)的更具体的类型可以通过处理器进行检索和查询全

因此,我建议您创建一个新的具体类型,专门用于保存多个错误(在a中Vec>),并实现Error接口.由您来决定描述并导致它暴露.

单一类型将使您的客户更容易进行预测,而不是具有未知(并且可能随着时间的推移而增加)潜在向下目标的数量.

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有