想象一下,当您为客人准备晚餐时,您会用米其林星级厨师的准确性切碎,油炸和沸腾。意外发生。您的烹饪创作开始发疯和抽烟,因为您忘了降低热量!您必须快速移动。但是,当您伸手去拿火焰时,它会滑倒并散发到地板上。
在JavaScript和Python等许多编程语言中,尝试/捕获策略用于处理此类错误。这类似于在您的厨房变成地狱荒原之前捕捉飞行锅盖的争夺。它涉及停止执行您的代码并试图处理发生的灾难。尽管它可能会派上用场,但它也可以将您的代码变成令人困惑的TryCatch块网络,该块的阅读,调试和维护具有挑战性。
try {
bakeCookies();
} catch (error) {
console.log("The oven isn't working: ", error);
}
如果您准备了灭火器怎么办?一种简单明了的解决方案,易于实施并防止误解。这与GO的错误处理策略非常相似,后者将错误视为值。这是一个直接的想法,可以阻止您的代码成为异常处理过山车。但这有点太陈旧了。它没有一种区分不同类型的错误的方法。
cookies, err := bakeCookies()
if err != nil {
fmt.Println("The oven isn't working: ", err)
}
Rust准备将您的错误处理汉堡翻转为完美,并用钳子握手。它结合了异常的表现力和易于将误差视为值的易用性,类似于它的做法。结果?一个特殊的,强大的错误处理系统,就像一个储存良好的厨房,准备应对任何烹饪灾难。您身边有可靠的厨师来帮助您进行编码,er,烹饪是Rust的Option
和Result
类型。
#[derive(Debug)]
enum OvenError {
NoHeat,
Overheat,
Unknown(String),
}
let attempt = bake_cookies();
match attempt {
Ok(cookies) => {
println!("Yummy, our cookies are ready: {:?}", cookies);
},
Err(error) => {
match error {
OvenError::NoHeat => println!("Oops! The oven isn't heating."),
OvenError::Overheat => println!("Oh no! The oven is overheating."),
_ => println!("Something else went wrong with the oven: {}", error),
}
}
}
戴上厨师的帽子,围裙,抓住您的编码刮刀。让我们参加Rust的精致且可靠的错误处理技术的美味之旅。到这次美味的旅程结束时,您将烹饪以优雅,效率和创造力处理错误的锈蚀代码,就像专业厨师一样处理厨房打ic!
生锈错误类型:食谱和烹饪过程
在Rust中,我们通常处理两种类型的错误:
- 编译时间错误:这些类似于配方相关的错误。当Rust不理解您要做的事情时,它们就会发生。当您尝试编译程序时,Rust将检测出错误的关键字和封闭括号等错误。
- 运行时错误:这些遗漏类似于烹饪时可能发生的错误。当您的程序运行时,当出现问题时会发生它们。例如,如果您的程序试图访问不存在或将数字除以零的文件,则将导致运行时错误。
现在,让我们看一下Rust如何帮助我们处理这些运行时错误。
铁锈冰箱:选择和结果
假设我们在生锈的厨房里。我们的成分放在厨房的冰箱中。对于Rust中这些成分的可用性(或缺乏),有两种类型,它们是选择和结果。
1.选项类型:我们有成分吗?
选项类型就像检查冰箱中是否有特定成分。这是一个可以采用两个值的枚举:
- 一些(value):这意味着该成分可用。
- 无:这意味着该成分不可用。
让我们在行动中看到它:
fn get_ingredient(ingredient: &str) -> Option<&str> {
match ingredient {
"tomatoes" if self.tomatoes_in_stock > 0 => Some("tomatoes"),
"garlic" if self.garlic_in_stock > 0 => Some("garlic"),
_ => None,
}
}
在get_ingredient函数中,我们检查请求的成分是否可用。如果是,我们返回一些(“成分”)。如果不是,我们不返回。
要处理get_ingredient返回的选项,我们可以使用匹配或如果让。
更多有关比赛的信息:Deep dive into match
match get_ingredient("tomatoes") {
Some(tomatoes) => println!("{} are available, let's cook!", tomatoes),
None => println!("We're out of tomatoes! Let's change the recipe."),
}
2.结果类型:成功的食谱还是厨房灾难?
RUST的结果类型类似于选项。但是,如果发生错误,它提供了有关出了问题的更多详细信息。这就像告诉我们我们的食谱是成功的还是厨房完全失败的。这是两个可能值的枚举:
- 确定(值):这意味着操作成功。
- err(e):这意味着操作失败,E将包含有关出了什么问题的信息。
让我们在我们的厨房里使用它:
enum KitchenError {
OutOfStock(String),
NotEnoughSalt,
BurnedFood,
}
fn cook_meal(meal: &str) -> Result<&str, KitchenError> {
match meal {
"pasta" if self.pasta_in_stock > 0 => Ok("pasta"),
"pasta" => Err(KitchenError::OutOfStock("pasta".to_string())),
_ => Err(KitchenError::OutOfStock(meal.to_string())),
}
}
在cook_meal功能中,我们尝试做饭。如果有饭菜,我们可以返回好的(“用餐”)。如果没有
处理结果类似于处理选项:
match cook_meal("pasta") {
Ok(meal) => println!("{} is ready, bon appétit!", meal),
Err(KitchenError::OutOfStock(ingredient)) => println!("We're out of {}, let's change the menu.", ingredient),
Err(_) => println!("Oops, something went wrong in the kitchen."),
}
厨房艾滋病:unwrap(),Expect()和?操作员
就像食品加工机或搅拌机一样,可能会使厨房任务更容易,Rust还具有一些内置的错误处理方法。这些是UnWrap(),Expect()和?操作员。
1. unwrap():勇敢的sous-chef
可以将unwrap()方法与大胆的sous-chef进行比较,他在不首先检查的情况下使用成分。当调用选项或结果时,如果有的话,unwrap()将为您提供值。但是,如果没有或错误,则该程序将惊慌和停止,就像意识到关键成分缺失的厨师一样。
let ingredient = get_ingredient("tomatoes").unwrap(); // This code might panic if we don't have tomatoes!
let meal = cook_meal("pasta").unwrap(); // Also, this might panic if the pasta cooking failed!
2.期望():准备好的sous-chef
期望()方法类似于unwrap(),但它使您可以提供一个错误消息。这就像一个笨蛋,在缺少成分时检查冰箱并提醒您。
let ingredient = get_ingredient("tomatoes").expect("We're out of tomatoes!"); // Will panic if we don't have tomatoes!
let meal = cook_meal("pasta").expect("The pasta cooking failed!"); // Will panic if the pasta cooking failed!
3.?操作员:迅速的sous-chef
? Rust的操作员就像一个迅速的厨师,当他们找不到成分时,他们立即告诉总厨。当调用选项或结果时,?如果有的话,将返回该值。但是,如果没有或错误,它将尽早从功能返回,有效地将错误传递给呼叫者。
fn prepare_dinner() -> Result<String, KitchenError> {
let ingredient = get_ingredient("tomatoes")?;
let meal = cook_meal("pasta")?;
Ok(format!("Dinner is served: {} with {}", meal, ingredient))
}
在prepar_dinner()中,如果get_ingredient(“ tomatoes”)或cook_meal(“ pasta”)返回err,?操作员将立即返回错误,有效地停止功能并将错误传递给呼叫者。
,这是,代码厨师!您享受了Rust-aurant繁忙的厨房的豪华之旅,并学习了准备无错误代码的精致技术。我们研究了烹饪代码中错误处理的各种方法,从突然的厨房大火和锅盖的突然发生,到我们身边有可靠的灭火器。
将错误视为价值观和异常表现力的有力组合,就像将菜肴结合在一起的秘密成分,是神奇的锈蚀剂的特殊性。以Option
和Result
为我们忠实的厨师,我们不仅为事情出错时做好了准备,而且还可以理解和有效地传达这些打ic,使我们的代码变得强大,可口和弹性。
就像在优质的餐饮场所一样,请记住,犯错是改善而不是灾难的机会。通过使用每个Option
和Result
,在我们的编码盘中添加另一段的理解力,我们不仅要处理错误。因此,我的朋友们,将您的厨师的帽子放在高处,并继续练习在Rust中处理错误的错误艺术。
让您的锈蚀和那些吃您的计划的人的心充满有效,可靠的代码的香气。像烹饪一样,编码最终是关于旅程的,而不是最终产品 - 每个错误都是学习新事物并迈向卓越的机会。
愉快的编码和Bon Appet,直到我们下一个编码库克!