typestar

Implementar std::error::Error en Rust

El trait Error deja a tu tipo viajar como error en un Box y reportar una causa.

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

#[derive(Debug)]
struct ParseFailure {
    line: usize,
    cause: std::num::ParseIntError,
}

impl fmt::Display for ParseFailure {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "line {} is not a number", self.line)
    }
}

impl Error for ParseFailure {
    fn source(&self) -> Option<&(dyn Error + 'static)> {
        Some(&self.cause)
    }
}

fn main() {
    let cause = "x".parse::<i32>().unwrap_err();
    let err = ParseFailure { line: 12, cause };
    println!("{err}");
    if let Some(inner) = err.source() {
        println!("caused by: {inner}");
    }
}

Cómo funciona

  1. Implementar Error requiere Debug y Display.
  2. source devuelve el error que está debajo de este.
  3. Quien llama puede recorrer toda la cadena de causas.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
29
Caracteres a escribir
567
Tokens
170
Ritmo de tres estrellas
105 tpm

Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 97 segundos.

Escribe este fragmento

Paso 2 de 5 en Tus propios tipos de error; paso 9 de 15 en Manejo de errores.

← Anterior Siguiente →