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
- Implementar
ErrorrequiereDebugyDisplay. sourcedevuelve el error que está debajo de este.- Quien llama puede recorrer toda la cadena de causas.
Palabras clave y builtins usados aquí
OptionResultSomedynfnfori32ifimplletselfstaticstructuseusize
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.
Paso 2 de 5 en Tus propios tipos de error; paso 9 de 15 en Manejo de errores.