thiserror y anyhow
The thiserror and anyhow crates are widely used to simplify error handling.
thiserrorse suele usar en bibliotecas para crear tipos de errores personalizados que implementanFrom<T>.- Las aplicaciones suelen utilizar
anyhowpara gestionar errores en funciones, como añadir información contextual a los errores.
use anyhow::{bail, Context, Result};
use std::fs;
use std::io::Read;
use thiserror::Error;
#[derive(Clone, Debug, Eq, Error, PartialEq)]
#[error("No se ha encontrado ningún nombre de usuario en {0}")]
struct EmptyUsernameError(String);
fn read_username(path: &str) -> Result<String> {
let mut username = String::with_capacity(100);
fs::File::open(path)
.with_context(|| format!("No se ha podido abrir {path}"))?
.read_to_string(&mut username)
.context("No se ha podido leer")?;
if username.is_empty() {
bail!(EmptyUsernameError(path.to_string()));
}
Ok(username)
}
fn main() {
//fs::write("config.dat", "").unwrap();
match read_username("config.dat") {
Ok(username) => println!("Nombre de usuario: {username}"),
Err(err) => println!("Error: {err:?}"),
}
}
This slide should take about 5 minutes.
thiserror
- La macro de derivación
Errorla proporcionathiserrory ofrece muchos atributos útiles para definir los tipos de error de forma compacta. - El trait
std::error::Errorse deriva automáticamente. - El mensaje de
#[error]se usa para derivar el traitDisplay.
anyhow
anyhow::Errores básicamente un envoltorio alrededor deBox<dyn Error>. Como tal, no suele ser una buena elección para la API pública de una biblioteca, pero se usa con frecuencia en aplicaciones.anyhow::Result<V>es un alias de tipo paraResult<V, anyhow::Error>.- El tipo de error real que contiene se puede extraer para analizarlo si es necesario.
- La funcionalidad proporcionada por
anyhow::Result<T>puede resultar familiar a los desarrolladores de Go, ya que ofrece patrones de uso y ergonomía similares a(T, error)de Go. anyhow::Contextes un trait implementado para los tipos estándarResultyOption. Se necesitause anyhow::Contextpara habilitar.context()y.with_context()en esos tipos.