Error handling 当字符串可以在标准输出中立即报告时,它是有效的错误类型吗?

Error handling 当字符串可以在标准输出中立即报告时,它是有效的错误类型吗?,error-handling,rust,Error Handling,Rust,我最近实现了一个国际象棋游戏的基本机制,并使用Result类型来收集人类输入,因为它可能无效。但是,我不确定应该为可能的错误选择什么类型(E) 我认为在建立图书馆时,引入新类型被认为是一种良好的做法。但是,如果可以立即处理结果,并且在stdout中报告错误,那么只返回结果s或结果s(或结果s,如果两者都可以发生)不是更简单吗 考虑以下情况: pub fn play() { let mut game = Game::new(); loop { match game

我最近实现了一个国际象棋游戏的基本机制,并使用
Result
类型来收集人类输入,因为它可能无效。但是,我不确定应该为可能的错误选择什么类型(
E

我认为在建立图书馆时,引入新类型被认为是一种良好的做法。但是,如果可以立即处理
结果
,并且在stdout中报告
错误
,那么只返回
结果
s或
结果
s(或
结果
s,如果两者都可以发生)不是更简单吗

考虑以下情况:

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

    loop {
        match game.turn() {
            Ok(()) => { game.turn += 1 }
            Err(e) => println!("{}", e)
        }
    }
}
游戏在终端中进行,任何输入错误都可以立即报告。在这种情况下引入自定义错误类型有什么附加值吗?

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

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

在您的情况下,如果您要立即打印字符串,那么字符串可能很好。但是有一个巧妙的小技巧,至少可以使函数签名更具未来性:返回

这是对错误的一种很好的抽象。几乎每种错误类型都实现了这一特性。用
试试看!()
和特性,可以轻松处理大多数错误。此外:对于字符串和
Box
,还有一些类型转换
impl
s。这允许将字符串作为错误返回:

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())
}
fn foo()->结果{
试试!(std::fs::File::open(“nothere”);//io::Error
试试!(呃(“哦,不!”);/&str
试试!(呃(“我把它弄坏了: