生锈食谱:锈蚀中错误处理的艺术
#javascript #初学者 #编程 #rust


Rust食谱横幅

想象一下,当您为客人准备晚餐时,您会用米其林星级厨师的准确性切碎,油炸和沸腾。意外发生。您的烹饪创作开始发疯和抽烟,因为您忘了降低热量!您必须快速移动。但是,当您伸手去拿火焰时,它会滑倒并散发到地板上。

在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的OptionResult类型。

#[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中,我们通常处理两种类型的错误:

  1. 编译时间错误:这些类似于配方相关的错误。当Rust不理解您要做的事情时,它们就会发生。当您尝试编译程序时,Rust将检测出错误的关键字和封闭括号等错误。
  2. 运行时错误:这些遗漏类似于烹饪时可能发生的错误。当您的程序运行时,当出现问题时会发生它们。例如,如果您的程序试图访问不存在或将数字除以零的文件,则将导致运行时错误。

现在,让我们看一下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繁忙的厨房的豪华之旅,并学习了准备无错误代码的精致技术。我们研究了烹饪代码中错误处理的各种方法,从突然的厨房大火和锅盖的突然发生,到我们身边有可靠的灭火器。

将错误视为价值观和异常表现力的有力组合,就像将菜肴结合在一起的秘密成分,是神奇的锈蚀剂的特殊性。以OptionResult为我们忠实的厨师,我们不仅为事情出错时做好了准备,而且还可以理解和有效地传达这些打ic,使我们的代码变得强大,可口和弹性。

>

就像在优质的餐饮场所一样,请记住,犯错是改善而不是灾难的机会。通过使用每个OptionResult,在我们的编码盘中添加另一段的理解力,我们不仅要处理错误。因此,我的朋友们,将您的厨师的帽子放在高处,并继续练习在Rust中处理错误的错误艺术。

让您的锈蚀和那些吃您的计划的人的心充满有效,可靠的代码的香气。像烹饪一样,编码最终是关于旅程的,而不是最终产品 - 每个错误都是学习新事物并迈向卓越的机会。

愉快的编码和Bon Appet,直到我们下一个编码库克!