虽然你可能有Result<(), &'static str>
,使用枚举的不同错误的可能性通常会更好。然后,您可以使用字符串格式(std::fmt::Display
实现)将它变成一个很好的错误消息。类似这样的:
use std::fmt;
enum Error {
FirstProblem,
SecondNuisance,
ThirdBadThing,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str(match *self {
Error::FirstProblem => "first problem",
Error::SecondNuisance => "second nuisance",
Error::ThirdBadThing => "third bad thing",
})
}
}
fn verify(input: &str) -> Result<(), Error> {
if !check_input(input) { return Err(Error::FirstProblem); }
if !check_input2(input) { return Err(Error::SecondNuisance); }
if !check_input3(input) { return Err(Error::ThirdBadThing); }
Ok(())
}
从语义上讲,Result
是非常好的;您的verify
函数可能会发出一切正常或发生错误的信号。如果出现错误,则说明它是值得的 - 因此是Error
类型。如果一切正常,是否还有可以传达的额外信息?如果这只是“它的工作”的问题,那么你的bool
可能总是true
,这种否定它的目的。因此让Ok
变体为()
是有意义的。
不会'Result <(),CustomError>'很适合,其中'CustomError'是一个Enum,状态为'Exception1',通过'Exception3'?这些状态当然可以包含一个字符串。但是这样你可以匹配调用者函数中的所有不同情况。 – marcusklaas 2014-11-04 23:22:27
@marcusklaas:如果你想给呼叫者一个恢复的机会,我会推荐它。像往常一样,访问现成可用的信息要比通过解析字符串等来试图通过它来获得信息要容易得多,而且要简单得多......考虑到'enum'的低成本(只是多一个字),它就是足够便宜,不会让很多不关心它的人负担过重。 – 2014-11-05 07:07:16
什么是错误? – 2014-11-05 12:31:25