当可以在stdout中立即报告String时,它是有效的错误类型吗?

莱杰兹

我最近实现了国际象棋的基本机制,并将这种Result<T, E>类型用于收集人类输入的方法,因为这可能是无效的。但是,我不确定应该为错误(E选择哪种类型

我已经收集到,在构建库时,引入新类型被认为是一种好习惯。但是,当Result可以立即处理并Err在stdout中报告时,仅返回Result<T, String>s或Result<T, &str>s(Result<T, Cow<str>>如果同时出现s或s)是否更简单

考虑以下情况:

pub fn play() {
    let mut game = Game::new();

    loop {
        match game.turn() {
            Ok(()) => { game.turn += 1 }
            Err(e) => println!("{}", e)
        }
    }
}

游戏在终端上进行,任何输入错误都可以立即报告。在这种情况下,引入自定义错误类型是否有任何附加值?

卢卡斯·卡尔伯特(Lukas Kalbertodt)

这是一个相当广泛的问题,没有明确的“正确”或“错误”答案。

在您的示例中需要注意的重要一点是,字符串几乎不包含任何易于访问的语义信息当然,您可以通过解析字符串来提取所有语义信息,但这确实是错误的方法。因此,大多数较大的库或应用程序都使用带有更多语义信息的错误类型,以简化错误处理。

在您的情况下,如果您仍然可以立即打印字符串,则字符串可能就可以了。但是,有一个巧妙的小技巧,以便至少使函数签名更富未来性:returnBox<Error>

Error特点是在错误的一个很好的抽象。几乎每种错误类型都实现了此特征。利用try!()Into特性,可以轻松处理大多数错误。此外:有一些impl用于string和的类型转换Box<Error>这允许将字符串作为错误返回:

fn foo() -> Result<(), Box<Error>> {
    try!(std::fs::File::open("not-here")); // io::Error
    try!(Err("oh noooo!"));   // &str
    try!(Err("I broke it :<".to_owned()));  // String
    Err("nop".into())
}

请参阅工作演示

编辑:请注意,它Box<Error>携带的语义信息比其他具体错误类型(如)少io::Error因此,总是回来不是一个好主意Box<Error>这只是您情况下的一种更好的方法:)

编辑2:最近,我已经阅读了很多有关错误处理模型的信息,这使我的看法有所改变。我仍然认为这个答案几乎是正确的。但是,我认为这远不如我在这里制定的那么容易。所以,一定要记住这个答案不适合作为一般的指导可言

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

QVariant与自己的类型比较有效吗?

来自分类Dev

有什么有效的方法可以将TArray <string>转换为TStringDynArray吗?

来自分类Dev

这是确定JavaScript变量类型的有效方法吗?

来自分类Dev

报告记录验证警告和错误的有效方法?

来自分类Dev

这个python代码可以更有效吗?

来自分类Dev

Clojure中的堆算法(可以有效实施吗?)

来自分类Dev

'/'真的是可以通过pcap查找的有效设备吗?

来自分类Dev

Winforms跨线程操作有时是有效的。有人可以解释吗?

来自分类Dev

一个对象可以有多个有效类型吗?

来自分类Dev

我可以使用更有效的查询吗

来自分类Dev

有效图形的类型可以在Dhall中编码吗?

来自分类Dev

java.lang.String不是创建spark数据框时int错误模式的有效外部类型

来自分类Dev

Tibco SQL直接查询:报告了JDBC错误:(SQLState =)-“这不是有效的SQL类型:2009

来自分类Dev

为什么TLC报告有效状态错误?

来自分类Dev

有效的HKEY可以为NULL吗?

来自分类Dev

此类型有效的“等级2功能”吗?

来自分类Dev

有效的网址可以包含多个问号吗?

来自分类Dev

批处理文件:-actions参数-它是有效的参数吗?

来自分类Dev

使用Java套接字时可以保证数据有效性吗?

来自分类Dev

有什么有效的方法可以将TArray <string>转换为TStringDynArray吗?

来自分类Dev

它是有效的js语法吗?

来自分类Dev

如何测试文本文件的编码...有效吗?它是什么?

来自分类Dev

如何有效地报告错误

来自分类Dev

“ man coproc”报告错误,但“ help coproc”有效(在哪里可以找到某些命令的文档?)

来自分类Dev

赋值会改变变量的有效类型吗?

来自分类Dev

错误后可以使用ODBC语句吗(有效)?

来自分类Dev

我可以得到一个指向指向 nullptr 的指针的指针,它是否有效

来自分类Dev

它是有效的 REST API URL 吗?

来自分类Dev

它是 Eratosthenes 筛的有效代码吗?

Related 相关文章

  1. 1

    QVariant与自己的类型比较有效吗?

  2. 2

    有什么有效的方法可以将TArray <string>转换为TStringDynArray吗?

  3. 3

    这是确定JavaScript变量类型的有效方法吗?

  4. 4

    报告记录验证警告和错误的有效方法?

  5. 5

    这个python代码可以更有效吗?

  6. 6

    Clojure中的堆算法(可以有效实施吗?)

  7. 7

    '/'真的是可以通过pcap查找的有效设备吗?

  8. 8

    Winforms跨线程操作有时是有效的。有人可以解释吗?

  9. 9

    一个对象可以有多个有效类型吗?

  10. 10

    我可以使用更有效的查询吗

  11. 11

    有效图形的类型可以在Dhall中编码吗?

  12. 12

    java.lang.String不是创建spark数据框时int错误模式的有效外部类型

  13. 13

    Tibco SQL直接查询:报告了JDBC错误:(SQLState =)-“这不是有效的SQL类型:2009

  14. 14

    为什么TLC报告有效状态错误?

  15. 15

    有效的HKEY可以为NULL吗?

  16. 16

    此类型有效的“等级2功能”吗?

  17. 17

    有效的网址可以包含多个问号吗?

  18. 18

    批处理文件:-actions参数-它是有效的参数吗?

  19. 19

    使用Java套接字时可以保证数据有效性吗?

  20. 20

    有什么有效的方法可以将TArray <string>转换为TStringDynArray吗?

  21. 21

    它是有效的js语法吗?

  22. 22

    如何测试文本文件的编码...有效吗?它是什么?

  23. 23

    如何有效地报告错误

  24. 24

    “ man coproc”报告错误,但“ help coproc”有效(在哪里可以找到某些命令的文档?)

  25. 25

    赋值会改变变量的有效类型吗?

  26. 26

    错误后可以使用ODBC语句吗(有效)?

  27. 27

    我可以得到一个指向指向 nullptr 的指针的指针,它是否有效

  28. 28

    它是有效的 REST API URL 吗?

  29. 29

    它是 Eratosthenes 筛的有效代码吗?

热门标签

归档