Error handling 处理输入数据未定义错误

Error handling 处理输入数据未定义错误,error-handling,rust,Error Handling,Rust,受此启发,我想问一下如何处理Rust中的输入数据类型错误。例如,以下函数要求输入数据类型为enum Animal。用户实际输入的数据类型没有定义,甚至是空的,如何 我应该在匹配中添加一个None=>None或\u=>None use std::fmt; use std::io::prelude::*; pub enum Animal { Cat(String), Dog, } impl fmt::Display for Animal { fn fmt(&sel

受此启发,我想问一下如何处理Rust中的输入数据类型错误。例如,以下函数要求输入数据类型为
enum Animal
。用户实际输入的数据类型没有定义,甚至是空的,如何

我应该在匹配中添加一个
None=>None
\u=>None

use std::fmt;
use std::io::prelude::*;

pub enum Animal {
    Cat(String),
    Dog,
}

impl fmt::Display for Animal {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match *self {
            Animal::Cat(ref c) => f.write_str("c"),
            Animal::Dog => f.write_str("d"),
        }
    }
}

fn main() {
    let p: Animal = Animal::Cat("whiskers".to_owned()); // yes, work! 
    let p: Animal = Animal::BadCat("whiskers".to_owned()); // Badcat not defined,??
}
编译器错误:

错误:在当前作用域中找不到类型“Animal”的名为“BadCat”的关联项
--> :20:25
|
20 |让p:Animal=Animal::BadCat(“胡须”。to_owned());//未定义Badcat,??
|                         ^^^^^^^^^^^^^^
Rust是一种强大的静态类型编译时类型检查语言

这意味着与Python不同,用户不可能将无效类型传递给您的函数(除非他们传递的数据是通过
unsafe
无效强制的,但您无法合理地检测到这一点。请参阅我的关于对
bool
的不正确转换)。你不必为此担心

在更一般的情况下,您唯一需要担心在Rust中检查类型变量的时间是从外部Rust接收数据时,例如通过配置或数据文件,或者通过FFI函数。在这些情况下,通常会返回某种类型的
结果
,以指示不良数据。然而,在某些情况下,特别是在FFI中,如果您收到的数据格式特别不正确,则可以接受
恐慌

这种类型的检查通常不涉及枚举上的
match
语句,而是更基本的检查,例如关于字符串或整数比较的断言,这些比较是您试图重新解释为更高级别枚举类型的一组已知值之一



1在“强类型”的实际含义上存在一些不一致和分歧,在本例中,我用它来表示“几乎没有任何隐式类型强制”。

代码中没有输入处理-只有一个未定义的
enum
变量。而且,
匹配
是详尽的;无需使用
,因为包含了
动物
的所有选项-其他任何选项都将是纯类型错误,就像您的情况一样。