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
试试!(呃(“我把它弄坏了: