Múltiplos Tipos de Erro

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Neste laboratório, vemos um exemplo onde um Option precisa interagir com um Result, ou um Result<T, Error1> precisa interagir com um Result<T, Error2>.

Nota: Se o laboratório não especificar um nome de arquivo, você pode usar qualquer nome de arquivo que desejar. Por exemplo, você pode usar main.rs, compilar e executá-lo com rustc main.rs && ./main.

Múltiplos tipos de erro

Os exemplos anteriores foram sempre muito convenientes; Results interagem com outros Results e Options interagem com outros Options.

Às vezes, um Option precisa interagir com um Result, ou um Result<T, Error1> precisa interagir com um Result<T, Error2>. Nesses casos, queremos gerenciar nossos diferentes tipos de erro de uma forma que os torne compostos e fáceis de interagir.

No código a seguir, duas instâncias de unwrap geram diferentes tipos de erro. Vec::first retorna um Option, enquanto parse::<i32> retorna um Result<i32, ParseIntError>:

fn double_first(vec: Vec<&str>) -> i32 {
    let first = vec.first().unwrap(); // Generate error 1
    2 * first.parse::<i32>().unwrap() // Generate error 2
}

fn main() {
    let numbers = vec!["42", "93", "18"];
    let empty = vec![];
    let strings = vec!["tofu", "93", "18"];

    println!("The first doubled is {}", double_first(numbers));

    println!("The first doubled is {}", double_first(empty));
    // Error 1: the input vector is empty

    println!("The first doubled is {}", double_first(strings));
    // Error 2: the element doesn't parse to a number
}

Nas próximas seções, veremos várias estratégias para lidar com esse tipo de problema.

Resumo

Parabéns! Você concluiu o laboratório de Múltiplos Tipos de Erro. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.