Manipulação de Erros com Box em Rust

Beginner

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

Introdução

Neste laboratório, o código demonstra como usar o tipo Box para preservar erros originais, encapsulando-os, permitindo o tratamento dinâmico de erros, e o trait From da biblioteca Std auxilia na conversão de qualquer tipo que implemente o trait Error no objeto trait Box<Error>. Ele inclui um exemplo de conversão e tratamento de erros usando Box com um tipo de erro personalizado.

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.

Boxing de erros

Uma maneira de escrever código simples, preservando os erros originais, é fazer o Box deles. A desvantagem é que o tipo de erro subjacente só é conhecido em tempo de execução e não é determinado estaticamente.

A stdlib ajuda a fazer o boxing de nossos erros, fazendo com que Box implemente a conversão de qualquer tipo que implemente o trait Error no objeto trait Box<Error>, via From.

use std::error;
use std::fmt;

// Change the alias to `Box<error::Error>`.
type Result<T> = std::result::Result<T, Box<dyn error::Error>>;

#[derive(Debug, Clone)]
struct EmptyVec;

impl fmt::Display for EmptyVec {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "invalid first item to double")
    }
}

impl error::Error for EmptyVec {}

fn double_first(vec: Vec<&str>) -> Result<i32> {
    vec.first()
        .ok_or_else(|| EmptyVec.into()) // Converts to Box
        .and_then(|s| {
            s.parse::<i32>()
                .map_err(|e| e.into()) // Converts to Box
                .map(|i| 2 * i)
        })
}

fn print(result: Result<i32>) {
    match result {
        Ok(n) => println!("The first doubled is {}", n),
        Err(e) => println!("Error: {}", e),
    }
}

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

    print(double_first(numbers));
    print(double_first(empty));
    print(double_first(strings));
}

Resumo

Parabéns! Você concluiu o laboratório de Boxing de erros. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.